创建程序集成功,在 sys.assembly_modules 中找不到任何内容

Create Assembly is successful, nothing found in sys.assembly_modules

第一次尝试 CLR 集成,所以我可以使用 Regex 工具。

我创建程序集:

CREATE ASSEMBLY SQLRegexTools
  FROM 'D:\CODE\SQLRegexTools\SQLRegexTools\bin\Release\SQLRegexTools.dll'

这成功了,程序集出现在 SELECT@FROM sys.assemblies.

但是没有记录返回到 SELECT * FROM sys.Assembly_modules.

当我尝试创建函数来调用其中一种方法时,

CREATE FUNCTION RegExMatch(@pattern varchar(max)
                            , @SearchIn varchar(max)
                            , @options int)
RETURNS varchar
 EXTERNAL NAME SQLRegexTools.Functions.RegExMatch

我收到错误消息“消息 6505,无法在程序集中找到类型 "Functions" 'SQLRegexTools.'

VB 模块的 class 名称是 "Functions"。为什么这在错误中称为类型,为什么我在模块中看不到任何内容?

当 SQL 服务器无法解析所提供的名称时,会发生此错误。试试下面的代码片段,看看是否能解决问题。

CREATE FUNCTION RegExMatch(@pattern varchar(max)
                            , @SearchIn varchar(max)
                            , @options int)
RETURNS varchar
AS EXTERNAL NAME SQLRegexTools.[Functions].RegExMatch

个人 functions/methods 访问本机代码的分辨率与多部分对象名称(例如类型)相对难以区分。

另外请注意,使用嵌套命名空间的本机代码必须在同一对引号内完全限定嵌套命名空间。例如,如果 RegExMatch 位于 SQLRegexTools.A.B.C.RegExMatch,在 SQL 服务器中将其与 EXTERNAL NAME 一起使用时,您可以将其引用为 SQLRegexTools.[A.B.C].RegExMatch

答案是乔伊。谢谢你。

经过大量调查和测试后,我了解到这个过程中有几个陷阱。他们经常埋头于长篇大论的整个过程,我总结一下:

  • 正如乔伊所解释的,需要完全限定名称。更完整...

示例:

             1                 2                   3               4

[SQLRegexToolsASM].[SQLRegexToolsNS.RegexFunctionsClass].RegExMatch

  1. 这是 CREATE ASSEMBLY 步骤中的程序集名称。
  2. 这是程序集项目属性中的根命名空间。如果您声明了一个或两个名称空间,则它们必须以正确的顺序包含在该列表中的此项之后和第 3 项之前。请注意,所有这些名称空间都包含在它们自己的方括号中。

程序集.[rootnamespace.namespace.namespace].classname.methodname”

  1. 这是您分配给 class 的 Class 名称,可能像这样

    Public Class RegexFunctionsClass

  2. 在您的 VB 或 C# 程序集中定义的方法的名称。