【问题标题】:Error 6522 while executing a SQL CLR function on one environment whereas its working on another在一个环境中执行 SQL CLR 函数而在另一个环境中工作时出现错误 6522
【发布时间】:2016-12-31 08:09:57
【问题描述】:

在存储过程的 select 语句中执行 CLR 函数(从 SQL UDF 中)时,我的应用程序抛出以下错误。

A .NET Framework error occurred during execution of user-defined routine or aggregate "clr_name": 
System.Exception: clr_name failed: id = 7
System.Exception: 
   at ABC.SQLCLR.XYZ.XX.clr_name(decimal param1, integer param2)

SQL 分析器中的错误代码为 6522

在我们调用 UDF 并在其中调用 CLR 时代码中断

SELECT ColumnId, RowId,  [OtherDB].dbo.udf_callingCLRWithin(ColumnID, RowID,[XYZ]) AS [XYZ]
FROM tableName

UDF 的签名

ALTER FUNCTION [dbo].[udf_callingCLRWithin](Parameters)
RETURNS [numeric](28, 12) WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME <AssemblyPath>.[clr_*****]

但这只会发生在一种环境中,而不会发生在另一种环境中。 我的应用程序和数据库位于不同的服务器上,这在所有环境中都很常见。

我发现this 提出了类似的问题,但标记为答案的解决方案主要是关于 CLR 中的解决方案。

但我无法访问 CLR 代码,我认为这也不是代码的问题,因为它在其他环境中运行良好。

到目前为止我已经验证过的事情:

  1. 调用 CLR 的数据库具有“TRUSTWORTHY TRUE”
  2. 我检查了在服务器上启用了 CLR

知道 CLR 代码在其他服务器上运行良好这一事实,我可以在数据库服务器上具体检查什么?

.Net Framework 和 SQL 版本有什么作用吗?我应该检查什么以及在哪里检查?

【问题讨论】:

  • 出现错误的程序集是否设置为 PERMISSION_SET = EXTERNAL_ACCESSUNSAFE?如果没有,请先尝试这两个。另外,请发布准确和完整的错误消息。
  • .NET Framework 版本仅在您手动将任何 .NET Framework 库加载到 SQL Server(通过 CREATE ASSEMBLY)时才重要,因为您的程序集引用了它并且它不是 SQLCLR 的一部分。但是查看报告的确切错误消息真的会有所帮助,因为这将提供有关问题的线索。我之前至少看到过两次此错误,但无法通过问题顶部的高度编辑消息来缩小范围。
  • 这就是我得到的所有错误信息。我只是掩盖了 CLR 和程序集的名称。我现在用随机名称更新了它。另外,我在下面的答案中发布了真正的问题。请看一看。

标签: sql sql-server-2012 sqlclr


【解决方案1】:

这个问题让我有点意外。

我共享的引发错误的 SQL 语句是从一个表中读取的,该表实际上是通过从链接服务器获取数据而生成的。早些时候,我认为这并不重要,所以我在起草问题时对其进行了过滤。原来是这样的,

SELECT * INTO #tablename
FROM OPENQUERY([Linked-Server-name], 'SELECT * FROM RemoteDB.dbo.Remotetable')

SELECT ColumnId, RowId,  [OtherDB].dbo.udf_callingCLRWithin(ColumnID, RowID,[XYZ]) AS [XYZ]
FROM #tableName --This statement breaks here and throws error

此处的代码中断因为链接服务器是 SQL 2014,而通过“表名”执行 CLR 的主服务器是 SQL 2012。当我将链接服务器更改为与主服务器相同的 SQL 版本时,代码运行得非常好。

不确定这是特定于 SQL 2014 还是任何不同版本的 SQL。

【讨论】:

  • 高度怀疑链接服务器的 SQL Server 版本是否与该问题有关。实例、数据库或其他东西的配置必须有其他一些差异......我什至看不到 SQLCLR 和链接服务器之间的连接,因为它们是单独的语句......这 3 列的数据类型是什么在用作函数参数的临时表中?这两个 SQL 语句是否包含在显式事务中?
  • 我自己没有太多支持它,但没有其他改变,我们只是将它指向另一个 SQL 2012 服务器。它开始工作了。我找到了一个链接support.microsoft.com/en-us/kb/2967594。临时表中columnId和RowId列的数据类型都是INT,而CLR的参数是Numeric、Numeric和NVARCHAR。并且这些语句不在事务中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多