T-SQL在汇编中找不到CLR函数 - 没有命名空间?

时间:2017-06-20 23:54:45

标签: sql-server dll .net-assembly sqlclr

我们正在移植一个SQL Server数据库,其中包含一个带日期函数的CLR程序集(开发人员已经不见了)。我从DLL创建了程序集(它在sys.assemblies中列出):

CREATE ASSEMBLY ArkaDB FROM 'C:\Temp\ArkaDB.dll' WITH PERMISSION_SET = SAFE;

但是当我尝试为GetOIDate函数创建一个SQL存储过程时:

create FUNCTION [dbo].[GetOIDate](@ActivityDate [datetime])
RETURNS [datetime] WITH EXECUTE AS CALLER
AS 
EXTERNAL NAME [ArkaDB].[ArkaDB.UserDefinedFunctions].[GetOIDate]

它给出了错误" Msg 6505,Level 16,State 2,Procedure GetOIDate,Line 2 找不到Type' ArkaDB.UserDefinedFunctions'在汇编' ArkaDB'。"

您可以在下面的ILSpy屏幕截图中看到DLL结构和功能代码。注意破折号" - "用于命名空间。从this问题开始,我们应该在EXTERNAL NAME规范中包含一个名称空间。但是如果没有命名空间呢?答案here表示您只需提供类似" EXTERNAL NAME [SqlClr] .Math。[Add]"。我已经尝试了我能想到的每一个变体,它们都给出了同样的无法找到的错误:

EXTERNAL NAME [ArkaDB].[ArkaDB.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].UserDefinedFunctions.[GetOIDate]
EXTERNAL NAME [ArkaDB].[.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].[-.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].[''.UserDefinedFunctions].[GetOIDate]
EXTERNAL NAME [ArkaDB].[ .UserDefinedFunctions].[GetOIDate]

有什么想法吗?我们正在运行SQL Server 2012,而DLL最初是为2008 R2开发并安装的。 ILSpy for ArkaDB DLL

编辑:对于srutzky,这里是ILSpy UserDefinedFunctions class

中的公共类定义

1 个答案:

答案 0 :(得分:0)

不幸的是我无法发表评论(声誉不够),所以让我们尝试一下答案:

您写道:"如果我在旧数据库中编写SQL函数create脚本,它会生成" EXTERNAL NAME [ArkaDB]。[UserDefinedFunctions]。[GetOIDate]"。" 。如果您从旧数据库编写程序集(我假设它在哪里工作),并以这种方式部署到新数据库,该怎么办?

类似的东西:

CREATE ASSEMBLY ArkaDB FROM binary_representation WITH PERMISSION_SET = SAFE;

这样你至少应该能够部署它。如果没有命名空间,则在程序集中,create函数应该像srutzky所说:

CREATE FUNCTION [dbo].[GetOIDate](@ActivityDate [datetime])
RETURNS [datetime] WITH EXECUTE AS CALLER
EXTERNAL NAME [ArkaDB].[UserDefinedFunctions].[GetOIDate]

请告诉我们它是怎么回事。

尼尔斯