SQL 服务器在我的 DLL/程序集中找不到我的函数

SQL Server can't find my function in my DLL / Assembly

我用 C# 创建了一个库 class,您可以看到以下代码:

namespace ManagedCodeAndSQLServer
{
    public class BaseFunctionClass
    {
        public BaseFunctionClass()
        {
        }


        [SqlProcedure]
        public static void GetMessage(SqlString strName, out SqlString
        strMessge)
        {
            strMessge = "Welcome," + strName + ", " + "your code is getting executed under CLR !";

        }
    }
}

我使用 UNSAFE 权限集 属性 构建了这个项目,并使用以下代码将 DLL 添加到 SQL 服务器:

use master;
grant external access assembly to [sa];
use SampleCLR;
CREATE ASSEMBLY ManagedCodeAndSQLServer
AUTHORIZATION dbo
FROM 'd:\ManagedCodeAndSQLServer.dll'
WITH PERMISSION_SET = UNSAFE
GO

它将程序集添加为我的数据库的一部分。

我想调用函数,如您所见:

CREATE PROCEDURE usp_UseHelloDotNetAssembly
@name nvarchar(200),
@msg nvarchar(MAX)OUTPUT
AS EXTERNAL NAME ManagedCodeAndSQLServer.[ManagedCodeAndSQLServer.
BaseFunctionClass].GetMessage
GO

但是我得到这个错误:

Msg 6505, Level 16, State 2, Procedure usp_UseHelloDotNetAssembly, Line 1
Could not find Type 'ManagedCodeAndSQLServer.
BaseFunctionClass' in assembly 'ManagedCodeAndSQLServer'.

这个问题很微妙,在像这里这样的在线格式中,它甚至看起来只是一个格式问题。但是问题完全在这里找到,在方括号内:

AS EXTERNAL NAME ManagedCodeAndSQLServer.[ManagedCodeAndSQLServer.
BaseFunctionClass].GetMessage

ManagedCodeAndSQLServer. 之后有一个不应该出现的实际换行符。它甚至反映在错误消息中:

Msg 6505, Level 16, State 2, Procedure usp_UseHelloDotNetAssembly, Line 1
Could not find Type 'ManagedCodeAndSQLServer.
BaseFunctionClass' in assembly 'ManagedCodeAndSQLServer'.

这又像是一个口头禅-
包装 ;-),但不是。如果换行符被删除使得 T-SQL 显示如下:

AS EXTERNAL NAME ManagedCodeAndSQLServer.[ManagedCodeAndSQLServer.BaseFunctionClass].GetMessage;

那就可以正常工作了。

一些补充说明:

  1. 无需授予 sa 任何东西。 sysadmin 固定服务器角色的任何成员都已拥有所有权限。
  2. 除了 SAFE 之外,问题中显示的代码无需标记为任何内容。除非绝对必要,否则请不要将任何程序集标记为 UNSAFE
  3. 无需将数据库设置为 TRUSTWORTHY ON。这是一个安全风险,应该避免,除非绝对必要
  4. 如果您正在学习 SQLCLR,请参阅我在 SQL Server Central 上就该主题撰写的系列文章:Stairway to SQLCLR(需要免费注册才能阅读其内容,但这是值得的:-)。