在SQL Server中利用CLR集成技术,可以让数据库直接运行C#编写的程序集,从而在存储过程中调用.NET代码来处理字符串、数学运算或外部资源访问等任务。这种方式适合用C#实现比T-SQL更方便的逻辑。

启用SQL Server的CLR集成
默认情况下CLR集成是关闭的,需要开启。使用以下命令启用:
-- 启用CLR集成 EXEC sp_configure 'clr enabled', 1; RECONFIGURE; GO
编写C#程序集
创建一个类库项目,方法必须是静态的,并使用Microsoft.SqlServer.Server命名空间下的特性标记。下面示例实现一个简单字符串反转函数:
using System;
using Microsoft.SqlServer.Server;
public class ClrDemo
{
[SqlFunction]
public static string ReverseString(string input)
{
if (input == null)
return null;
char[] arr = input.ToCharArray();
Array.Reverse(arr);
return new string(arr);
}
}
编译并部署程序集
将项目编译为DLL,例如ClrDemo.dll。然后在SQL中创建程序集,注意路径需为数据库服务器可访问的位置:
CREATE ASSEMBLY ClrDemo FROM 'C:libsClrDemo.dll' WITH PERMISSION_SET = SAFE; GO
创建存储过程或函数映射
虽然标题说存储过程,但上面方法更适合映射为函数。若要用存储过程形式,可写成无返回值方法并用SqlProcedure特性,再创建PROCEDURE。以下为函数映射示例:
CREATE FUNCTION dbo.fn_ReverseString(@input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS EXTERNAL NAME ClrDemo.ClrDemo.ReverseString; GO
在T-SQL中调用
部署完成后,可像普通函数一样使用:
SELECT dbo.fn_ReverseString('hello');注意事项
- 权限级别分为SAFE、EXTERNAL_ACCESS和UNSAFE,生产环境尽量用SAFE。
- 程序集代码不能包含不安全操作,如直接操作文件除非提升权限。
- CLR代码调试较复杂,应充分测试性能。
利用CLR集成,可以把C#的灵活性带进SQL Server,但务必控制使用范围,避免数据库承担过重逻辑。
常见错误
若遇到程序集拒绝加载,检查是否未开启clr enabled,或DLL目标框架与SQL版本不兼容。另外,方法必须为public static。
小结
通过上述步骤,就能在SQL存储过程或函数中调用C#程序集,实现CLR集成。合理运用可弥补T-SQL在复杂计算上的不足。