【发布时间】: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 代码,我认为这也不是代码的问题,因为它在其他环境中运行良好。
到目前为止我已经验证过的事情:
- 调用 CLR 的数据库具有“TRUSTWORTHY TRUE”
- 我检查了在服务器上启用了 CLR
知道 CLR 代码在其他服务器上运行良好这一事实,我可以在数据库服务器上具体检查什么?
.Net Framework 和 SQL 版本有什么作用吗?我应该检查什么以及在哪里检查?
【问题讨论】:
-
出现错误的程序集是否设置为 PERMISSION_SET =
EXTERNAL_ACCESS或UNSAFE?如果没有,请先尝试这两个。另外,请发布准确和完整的错误消息。 -
.NET Framework 版本仅在您手动将任何 .NET Framework 库加载到 SQL Server(通过
CREATE ASSEMBLY)时才重要,因为您的程序集引用了它并且它不是 SQLCLR 的一部分。但是查看报告的确切错误消息真的会有所帮助,因为这将提供有关问题的线索。我之前至少看到过两次此错误,但无法通过问题顶部的高度编辑消息来缩小范围。 -
这就是我得到的所有错误信息。我只是掩盖了 CLR 和程序集的名称。我现在用随机名称更新了它。另外,我在下面的答案中发布了真正的问题。请看一看。
标签: sql sql-server-2012 sqlclr