【问题标题】:Why can't t-sql find my function in my assembly?为什么 t-sql 在我的程序集中找不到我的函数?
【发布时间】:2013-05-13 02:35:51
【问题描述】:

我正在尝试使用 .NET CLR 创建存储过程。我成功地将以下代码编译成 .NET 3.5 DLL。

Imports System.Math
Imports System.Text.RegularExpressions
Imports Microsoft.SqlServer.Server

Partial Public Class LevenshteinerAndSoundexer

    <SqlProcedure()> _
    Public Shared Function getLevenshteinDistance(ByVal string1 As String, ByVal String2 As String) As Integer

然后我使用以下代码成功地将其添加为程序集:

create assembly
LevenshteinLibrary
from 'Path\LevenshteinLibrary.dll'

但是当我用这段代码创建过程时

create procedure testCLR(@s1 nvarchar(1000), @s2 nvarchar(1000))
as external NAME LevenshteinLibrary.LevenshteinerAndSoundexer.getLevenshteinDistance

我得到了错误

“在程序集中找不到类型‘LevenshteinLibrary’ 'LevenshteinLibrary'"

为什么它不能“看到”这个功能?

当我在 ILSpy 中检查 DLL 时会发生以下情况:

这是我扩展库时的样子

【问题讨论】:

  • 会不会是this namespace issue
  • 您也可以使用 ILSpy 并发布您的 dll like the question Pondlife linked to did 的屏幕截图吗?
  • @ScottChamberlain 我将不得不要求 SA 安装 ILSpy,这需要几天时间
  • 不,在你的机器上做,你可以在任何电脑上运行它,只要把它指向你编译的dll。该工具用于查看 .NET 程序集,与 SQL 无关。
  • 看起来和骗子一样。您需要LevenshteinLibrary.[LevenshteinLibrary.LevenshteinerAndSoundexer].getLevenshteinDistance,因为LevenshteinerAndSoundexer 大概在LevenshteinLibrary 命名空间中(以及作为程序集名称)。 VB.NET 自动附加一个root namespace

标签: .net sql-server-2008 tsql


【解决方案1】:

根据您上传的图片,您的班级LevenshteinerAndSoundexer 位于命名空间LevenshteinLibrary 下。因此,在定义要使用的类时,您需要包含类的命名空间(在方括号内,以免混淆解析器):

create procedure testCLR(@s1 nvarchar(1000), @s2 nvarchar(1000))
as external NAME LevenshteinLibrary.[LevenshteinLibrary.LevenshteinerAndSoundexer].getLevenshteinDistance
--  Name of object in SQL --^                          ^    Name of function in class --^
--           Full name of class (including namespace)-/

【讨论】:

    猜你喜欢
    • 2017-07-07
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 2014-06-26
    • 2013-04-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多