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

时间:2017-07-05 20:44:23

标签: sql-server integration clr

首次尝试CLR集成,因此我可以使用Regex工具。

我创建了程序集:

https://example.com/hello

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

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

当我尝试CREATE FUNCTION来调用其中一个方法时,

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

我收到错误消息'Msg 6505,在程序集'SQLRegexTools中找不到类型“函数”。

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

2 个答案:

答案 0 :(得分:1)

当SQL Server无法解析提供的名称时,会发生此错误。请尝试下面的代码段,看看这是否可以解决问题。

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

用于访问本机代码的各个函数/方法的解析与多部分对象名称(例如类型)相比无法区分。

另外需要注意的是,使用嵌套命名空间的本机代码必须完全限定同一对引号中的嵌套命名空间。例如,如果RegExMatch位于SQLRegexTools.A.B.C.RegExMatch,则在SQL Server中将SQLRegexTools.[A.B.C].RegExMatchEXTERNAL NAME一起使用时,会将其引用为${bool:ifElse('a','b')}

答案 1 :(得分:0)

这就是Joey的答案。谢谢。

在这个过程中,我经过多次调查和测试后学到了很多问题。他们经常被埋在关于整个过程的长篇文章中,我将在此总结:

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

示例:

             1                 2                   3               4

[SQLRegexToolsASM]。[SQLRegexToolsNS.RegexFunctionsClass] .RegExMatch

  1. 这是CREATE ASSEMBLY步骤中的程序集名称。
  2. 这是程序集项目属性的根命名空间。如果您声明了一个或两个命名空间,则必须在此项之后和此列表中的第3项之前按正确顺序包含它们。观察所有这些命名空间都包含在它们自己的方括号中。
  3. 组件。[rootnamespace.namespace.namespace] .classname.methodname”

    1. 这是您分配给班级的班级名称,可能就像这样

      Public Class RegexFunctionsClass

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