Sql server T-SQL在程序集中找不到CLR函数-没有命名空间?

Sql server T-SQL在程序集中找不到CLR函数-没有命名空间?,sql-server,dll,.net-assembly,sqlclr,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 [datetim

我们正在移植一个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,级别16,状态2,过程GetOIDate,第2行 在程序集“ArkaDB”中找不到类型“ArkaDB.UserDefinedFunctions”

您可以在下面的ILSpy屏幕截图中看到DLL结构和函数代码。请注意名称空间的破折号。从这个问题来看,我们应该在外部名称规范中包含一个名称空间。但是如果没有名称空间呢?答案表明您只需提供外部名称[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开发和安装的。


编辑:对于srutzky,这里是ILSpy中的公共类定义

,不幸的是,我不能评论信誉不够,所以让我们来;让我们试着回答:

您写道:如果我在旧数据库中编写SQL函数create脚本,它将生成外部名称[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]
请告诉我们进展如何


Niels

这一个-外部名称[Arkab].UserDefinedFunctions.[GetOIDate]-应该正确,或者可以在类名[Arkab].[UserDefinedFunctions].[GetOIDate]周围添加方括号。那门课被标记为公共课吗?谢谢你的回答。是的,该类是公开的-请参阅上面帖子中添加的图片。关于应该是正确格式的问题,您是对的。如果在旧数据库中编写SQL函数create脚本,它将生成外部名称[ArkaDB].[UserDefinedFunctions].[GetOIDate]。但是,当在新服务器中运行时,在程序集“ArkaDB”中找不到类型“UserDefinedFunctions”时,会出现类似错误。我的下一步是尝试在VisualStudio中重建DLL,但对于遗留代码来说,这总是令人担忧:我有正确的源代码吗?是否存在VS版本问题?您的名称是否与sys.assembl*表中的名称匹配?如此处所述:在第页上搜索sys。此处仅作猜测,但是否可以尝试使用DATETIME2而不是DATETIME作为输入参数和返回值类型?是否100%确定加载到SQL Server 2012的DLL与加载2008 R2的DLL完全相同?您应该使用以下查询比较在内容列中找到的值:从sys.assembly_文件中选择DATALENGTH[content]作为[bytes],*其中[name]如N“%ArkaDB%”和[file_id]=1;。如果它们的字节数相同,则需要比较内容。您可以将两台服务器的内容值复制并粘贴到查询中,在查询中创建它们作为VARBINARYMAX或VARCHARMAX变量,并查看它们是否相等。