我们正在移植一个包含带日期函数的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
这一个 - 'EXTERNAL NAME [ArkaDB] .UserDefinedFunctions [GetOIDate]' - 应该是正确的,或者您可以在周围的类名加方括号:'EXTERNAL NAME [ArkaDB] [。 UserDefinedFunctions] [GetOIDate]'。该类是否标记为“公共”? –
感谢您的回复。是的,课堂是公开的 - 请参阅上面添加的帖子。你说的应该是正确的格式。如果我在旧数据库中编写SQL函数create,它将生成“EXTERNAL NAME [ArkaDB]。[UserDefinedFunctions]。[GetOIDate]”。然而,这在运行新服务器时出现类似的错误“无法在程序集”ArkaDB'中找到类型'UserDefinedFunctions'“。我的下一步是尝试在Visual Studio中重新生成DLL,但这总是充满了遗留代码:我有正确的源代码吗?有VS版本问题? – user906802
你的名字是否与sys.assembl *表中的名称匹配?如此处所述:https://docs.microsoft.com/en-us/sql/t-sql/statements/create-function-transact-sql在页面上搜索“sys.” – shibormot