2017-06-20 71 views
1

我们正在移植一个包含带日期函数的CLR程序集的SQL Server数据库(开发人员已经很久了)。我创建从DLL组件(它在sys.assemblies列出):T-SQL在程序集中找不到CLR函数 - 没有名称空间?

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

但是,当我试图创建一个SQL存储过程的GetOIDate功能:

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结构以及函数代码。注意命名空间的破折号“ - ”。从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

这一个 - 'EXTERNAL NAME [ArkaDB] .UserDefinedFunctions [GetOIDate]' - 应该是正确的,或者您可以在周围的类名加方括号:'EXTERNAL NAME [ArkaDB] [。 UserDefinedFunctions] [GetOIDate]'。该类是否标记为“公共”? –

+0

感谢您的回复。是的,课堂是公开的 - 请参阅上面添加的帖子。你说的应该是正确的格式。如果我在旧数据库中编写SQL函数create,它将生成“EXTERNAL NAME [ArkaDB]。[UserDefinedFunctions]。[GetOIDate]”。然而,这在运行新服务器时出现类似的错误“无法在程序集”ArkaDB'中找到类型'UserDefinedFunctions'“。我的下一步是尝试在Visual Studio中重新生成DLL,但这总是充满了遗留代码:我有正确的源代码吗?有VS版本问题? – user906802

+0

你的名字是否与sys.assembl *表中的名称匹配?如此处所述:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql在页面上搜索“sys.” – shibormot

回答

0

可惜我不能评论(未声誉不够),所以让;试试用一个答案,而不是:

您写道:“如果我在旧数据库中编写SQL函数create脚本,它会生成“EXTERNAL NAME [ArkaDB]。[UserDefinedFunctions]。[GetOIDate]”。“。如果你从旧数据库编写程序集(它的工作原理,我假设),然后以这种方式部署到新数据库。

喜欢的东西:

CREATE ASSEMBLY ArkaDB FROM binary_representation WITH PERMISSION_SET = SAFE; 

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

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

请让我们知道它是怎么回事。 。

尼尔斯

相关问题