我们正在移植一个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
中的公共类定义答案 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]
请告诉我们它是怎么回事。
尼尔斯