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