问题标签 [clrstoredprocedure]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1628 浏览

sql-server-2008 - 在 CLR 存储过程中调用外部进程

我知道这不是一件容易的事,也不应该很受欢迎。但是有谁知道使用触发器或存储过程中的参数调用外部程序集的最佳方法?我已经尝试过 CLR 存储的 proc,但我无法添加更新 DB2 数据库所需的引用。因此,我想调用一个可以做到这一点的外部程序集。然后我会在更新触发器中调用这个程序集。

在 SQL Server 2008 R2 中,proc sys.xp_cmdshell 默认被阻止。所以这里的安全人员不想打开它。

谢谢 !

0 投票
1 回答
1661 浏览

log4net - 是否可以使用 Log4Net 在 CLR 存储过程中写入日志文件?

问题:无法在 CLR 存储过程中使用 Log4net 调试(写入)日志文件。我构建 CLR 项目的方式可能有问题?我只是将 DLL 导入 sql server(创建程序集......)。我还需要导入 App.Config 吗?

DLL 名称:CLRTest.dll

源代码:

Log4Net XML 配置(App.Config):

SQL Server 上的权限:

C:\log\ -- NETWORK SERVICE 和 MyDomain\sqlserveraccount 对“log”文件夹具有完全控制权。

SQL 脚本:

SQL 输出:

(无列名)

1

0 投票
3 回答
1297 浏览

sql - Sql Service Broker、CLR 集成、触发后端问题

我正在寻找构建用于存储/处理数据的后端的最有效方法。基本上,数据被发送到服务器,解析然后保存到数据库。然后根据数据库中的其他数据对其进行一些处理,然后通过电子邮件或短信发出警报。

平台是 .NET,数据库是 SQL Server 2005 或 2008。

IE

  1. 温度传感器向服务器发送 4 个字节的数据。
  2. 服务器将数据转换为实际值,例如 20。
  3. 然后将该值保存到 SQL 服务器数据库。
  4. 然后根据表中为该传感器设置边界的行检查该值,即 0-50
  5. 如果超出范围,则会发出警报。(通过短信或电子邮件发送。)

这一切看起来都非常简单,但我正在寻找最好的方法,因为理想的情况是这一切都“实时”发生,并且每秒可能有 100 或 1000 个请求。我想利用 SQL 2005/08 的一些“新”功能,例如我几乎没有经验的 Service Broker、CLR 集成、触发器等。

步骤 1 和 2 已经完成。

考虑到排队事务的数量,使用服务代理或 MSMQ 是否明智?鉴于我需要查找边界数据,我应该在什么时候处理警报数据?我有一些想法,我希望如何处理数据,但不确定要使用的最佳技术/方法。

我的想法是(从第 3 步开始)是将数据提交给服务代理,后者又调用 CLR 过程来处理数据上的“业务逻辑”。或者我是否使用触发器将数据添加到服务代理以处理数据?服务代理可以直接调用 CLR 过程吗?考虑到我想以更多的事件驱动而不是轮询来处理数据,使用服务代理是否是正确的想法?

从我在 Service Broker 上看到的示例来看,您似乎需要有代码来接收数据,而我真正想做的就是将数据添加到队列中并自动清空队列(将警报数据处理为它这样做)。

我可以通过标准存储过程来完成所有这些工作,但我想尽可能少地使用存储过程,而是使用 CLR 集成,因为业务逻辑将比示例中复杂得多。

鉴于服务代理处理排队和线程,我认为它可能是调用 CLR 过程来处理警报数据并发送短信或电子邮件的好选择?

请给我看光!谢谢!

0 投票
1 回答
181 浏览

tsql - 并行化 TSQL CLR 过程

我试图弄清楚如何并行化一些程序代码以在表中创建记录。

情况如下(抱歉,我无法提供太多实际代码):

我必须根据之前的服务日期、当前里程、计划的每日里程以及每次服务之间的里程差异来预测何时需要车辆服务。

总而言之 - 这是非常程序化的,对于每辆车,我需要考虑它的历史、当前的维修状态、每日里程(可以根据里程计划中定义的范围而变化)和维修顺序。

目前我正在用 PHP 计算所有这些,100 辆车大约需要 20 秒。由于将来可能会扩展到数千个,因此 20 秒太长了。

所以我决定尝试在 CLR 存储过程中执行此操作。起初我以为我会尝试多线程,但是我很快发现在 TSQL 主机中做起来并不容易。有人建议我让 TSQL 自己解决并行化问题。但是我不知道怎么做。如果不是因为代码需要创建记录,我可以将它定义为一个函数并执行以下操作:

并且 TSQL 应该弄清楚它可以并行化,但我知道过程没有替代方案。

我能做些什么来并行化这个吗?

0 投票
1 回答
976 浏览

.net - 执行 CLR 存储过程以运行 Cognos 报告时发生 System.IO.FileNotFoundException

早上好。我目前遇到 CLR 存储过程调用在 Visual Basic (VS 2008) 中创建的程序集的问题。在最高级别,程序集执行 Cognos8 中包含的报告并将输出移动到网络上的特定目录。从简单的测试 EXE 调用该方法时我没有问题,但是当我尝试通过 CLR 存储过程执行时,我得到以下信息:

消息 6522,级别 16,状态 1,过程 ReportRunner,第 0 行

在执行用户定义的例程或聚合“ReportRunner”期间发生 .NET Framework 错误:

System.IO.FileNotFoundException:无法加载文件或程序集“cognosdotnetassembly_2_0,版本=10.1.4707.501,Culture=neutral,PublicKeyToken=d6e6d7d808b7e5b7”或其依赖项之一。该系统找不到指定的文件。System.IO.FileNotFoundException:

在 System.Reflection.Assembly._nLoad(AssemblyName 文件名,字符串 codeBase,证据 assemblySecurity,程序集 locationHint,StackCrawlMark 和 stackMark,布尔 throwOnFileNotFound,布尔 forIntrospection)

在 System.Reflection.Assembly.nLoad(AssemblyName 文件名,字符串 codeBase,证据 assemblySecurity,程序集 locationHint,StackCrawlMark 和 stackMark,布尔 throwOnFileNotFound,布尔 forIntrospection)

在 System.Reflection.Assembly.InternalLoad(AssemblyName assemblyRef,证据 assemblySecurity,StackCrawlMark 和 stackMark,Boolean for Introspection)

在 System.Reflection.Assembly.LoadWithPartialNameInternal(字符串部分名称,证据 securityEvidence,StackCrawlMark 和 stackMark)

在 System.Reflection.Assembly.LoadWithPartialName(字符串部分名称,证据 securityEvidence)

在 System.Xml.Serialization.TempAssembly.LoadGeneratedAssembly(类型类型,字符串 defaultNamespace,XmlSerializerImplementation& 合同)

在 System.Xml.Serialization.XmlSerializer.FromMappings(XmlMapping[] 映射,类型类型) 在 System.Web.Services.Protocols.SoapClientType..ctor(类型类型)

在 System.Web.Services.Protocols.SoapHttpClientProtocol..ctor() 在 cognosdotnet_2_0.reportService1..ctor()

在 ReportRunnerv3.ReportRunner.ExecuteReport(Int32 inPLAN_ID,Int32 inContract_Sfx,字符串 inRptDate_DT,字符串 inPlanType,字符串 inInvstmentOnlyInd,字符串 inMOMInd,字符串 inGPSIInd,字符串 inPBTInd,字符串 inPICAInd,字符串 inClientAccomInd,字符串 inInstSelectInd,字符串 inRptType,Int32 和 outRC)

注释 •cognosdotnetassembly_2_0 与“ReportRunner”程序集位于同一目录中 •cognosdotnetassembly_2_0 使用CREATE ASSEMBLY 进行编目,权限集=不安全 •cognosdotnetassembly_2_0 也安装在GAC 中

以下是 fuslogvw.exe 提供的消息:

*组装活页夹日志条目(8/11/2011 @ 5:57:39 AM)*

操作失败。

绑定结果:hr = 0x80070002。该系统找不到指定的文件。

程序集管理器从以下位置加载:c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\mscorwks.dll

在可执行文件 c:\Program Files\Microsoft SQL Server\MSSQL10_50.SQLEXPRESS\MSSQL\Binn\sqlservr.exe 下运行

--- 详细的错误日志如下。

=== 预绑定状态信息 ===

日志:用户 = NT AUTHORITY\NETWORK SERVICE

日志:DisplayName = cognosdotnetassembly_2_0,Version=10.1.4707.501,Culture=neutral,PublicKeyToken=d6e6d7d808b7e5b7(完全指定)

日志:Appbase = file:///c:/Program Files/Microsoft SQL Server/MSSQL10_50.SQLEXPRESS/MSSQL/Binn/

日志:初始 PrivatePath = NULL

日志:动态基础 = NULL

日志:缓存基础 = NULL

日志:AppName = NULL

调用程序集:System.Xml,Version=2.0.0.0,Culture=neutral,PublicKeyToken=b77a5c561934e089。

===

LOG:此绑定在默认加载上下文中开始。LOG:未找到应用程序配置文件。

LOG:使用来自 c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\config\machine.config 的机器配置文件。

日志:后策略参考:cognosdotnetassembly_2_0,Version=10.1.4707.501,Culture=neutral,PublicKeyToken=d6e6d7d808b7e5b7

LOG:托管 Fusion。检查主机关于这个程序集。

日志:程序集不在 CLR 加载列表中。询问主机组装店。

日志:尝试使用程序集 cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7、processorarchitecture=x86 托管程序集存储。

日志:尝试使用程序集 cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7、processorarchitecture=msil 来托管程序集存储。

日志:尝试使用程序集 cognosdotnetassembly_2_0、version=10.1.4707.501、culture=neutral、publickeytoken=d6e6d7d808b7e5b7 来托管程序集存储。

警告:主机程序集存储不包含此程序集。

ERR:预下载检查期间发生不可恢复的错误(hr = 0x80070002)。

有人可以提供有关为什么 SQL Server 无法找到 cognosdotnetassembly_2_0 的见解吗?

如果您需要更多信息,请告诉我。

感谢你的协助。

- 克里斯

0 投票
1 回答
299 浏览

sql - 高效的 SQL 地理通配符名称搜索 20mill+ 记录

我们有一个 SQL 2008 数据库,其中包含 2000 万多个 geoWe 位置(并且还在增长),每个位置都包含标准的名称/地址/地理/ID/等列。

我们需要一种基于距离有效搜索记录的方法,还需要通过全文索引“包含”关键字。基本思想是我们根据最大距离搜索我们附近的位置。

现在,当我们在 1 英里内搜索完整的字符串(例如星巴克)时,搜索会在几秒钟内返回。但是,如果我们在 1 英里内搜索“星”,搜索有时可能需要几分钟才能返回。

我们一直在玩这样的逻辑:

然而,这在搜索中引入了欺骗和其他问题。我们也一直在尝试使用我们在网上找到的 POWER 论坛。

我们还有其他查询效果很好,它们仅基于距离或某个类别 ID,它们会在一秒钟内返回。最大的问题是通配符字符串匹配。

在处理超过 2000 万条记录时,有没有人有一个很棒的 SQL 或 CLR proc 可以接受名称(通配符支持)和距离?

现在我们很困:(

在此先感谢,杰夫

0 投票
1 回答
1710 浏览

clr - 带有 SqlContext.Pipe.Send 的 clr 存储过程应该返回十进制,返回 int

我有一个必须返回十进制值的 clr 存储过程。我现在不能使用输出参数 - 我需要重用不处理输出参数的现有库。我的存储过程返回一个值 - 但它丢失了十进制数字。
任何想法为什么?谢谢,珍妮

编辑:忘记添加 SqlContext.Pipe.Send(string.Format("decValue = {0}", decValue)); 显示小数位但 SqlContext.Pipe.Send(record); 不返回小数位。

0 投票
1 回答
2855 浏览

sql-server - .NET Framework 执行被中止。另一个查询导致 AppDomain db.dbo[runtime].4 被卸载

我有一个正在尝试调试的 SQL CLR 函数(用 c#.net 编写)。我将 Visual Studio 附加到 sqlserver 进程并开始逐步执​​行,但它不断崩溃并以以下错误消息结束:


.NET Framework 执行被中止。另一个查询导致 AppDomain DatabaseName.dbo[runtime].4 被卸载。


(DatabaseName.dbo[runtime] 更改后的数字 - 每次崩溃时递增)

它有时甚至会导致 sql server 进程崩溃并停止服务。

当我不调试时,该函数工作得非常好,没有错误。这仅在我调试时发生。

有谁知道是什么原因造成的?

谢谢

0 投票
1 回答
1504 浏览

msbuild - 如何通过 MsBuild 命令行部署 CLR 存储过程?

我可以从解决方案资源管理器中部署一个 SqlClr 项目项目,方法是右键单击它并选择部署。但是,我想要一个命令行版本,我还可以在其中指定自定义 ConnectionString。

0 投票
1 回答
3683 浏览

sql-server-2008 - 从 SQL Server 2008 调用非托管 C/C++ DLL 函数

我有一个庞大的 C/C++ 函数库,需要从 SQL Server 2008 调用。我编写了一个 C# 适配器类,它从 Win32 DLL 加载这些函数DllImport并将它们公开给 .Net 代码。这在大多数 .Net 应用程序中运行良好。
现在,我尝试在 SQL Server CLR 中使用相同的技术。我创建了一组调用适配器类的 CLR 函数和存储过程。这不起作用,因为尝试加载非托管 DLL 会导致System.BadImageFormatException.
我可以使用扩展存储过程来做到这一点,但该方法已被弃用,并且可能在任何新版本的 SQL Server 中都不再使用。
从 CLR 存储过程调用非托管函数的正确方法是什么?我猜这应该在进程外完成。


我试图让我的存储过程调用公开这些功能的 Web 服务。这听起来是个好主意,但到目前为止,我在部署进行 Web 服务调用的 SQLCLR 程序集时遇到了问题。我无法加载依赖于程序System.ServiceModel.dll集版本的程序集。version=3.0.0.0System.Web.dll2.0.0.0

加载System.Web程序集给我以下错误:

程序集 'System.Web' 引用程序集 'system.web, version=2.0.0.0,culture=neutral, publickeytoken=b03f5f7f11d50a3a.',当前数据库中不存在。SQL Server 尝试从引用程序集所在的同一位置定位并自动加载引用程序集,但该操作失败(原因:版本、区域性或公钥不匹配)。请将引用的程序集加载到当前数据库中,然后重试您的请求。

我找到了部署System.Web程序集问题的解决方案。与其从 部署它,不如从 部署C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dllC:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll。然后所有其他必需的程序集也被部署。

按部署顺序排列的程序集列表:

  • C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\SMdiagnostics.dll
  • C:\Windows\Microsoft.NET\Framework64\v2.0.50727\System.Web.dll
  • C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Messaging.dll
  • C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.dll
  • C:\Program Files\Reference Assemblies\Microsoft\Framework\v3.0\System.IdentityModel.Selectors.dll
  • C:\Windows\Microsoft.NET\Framework\v3.0\Windows Communication Foundation\Microsoft.Transactions.Bridge.dll