CLR 集成入门

本主题概述了使用 SQL Server 与 .NET Framework 公共语言运行时(CLR)集成编译数据库对象所需的命名空间和库。 本主题还演示如何编写、编译和运行用 Visual C# 编写的简单 CLR Microsoft 存储过程。

所需的命名空间

从 SQL Server 开始。 CLR 集成功能在名为 system.data.dll的程序集中公开,这是 .NET Framework 的一部分。 可以在全局程序集缓存(GAC)以及 .NET Framework 目录中找到此程序集。 通常,命令行工具和 Microsoft Visual Studio 会自动添加对此程序集的引用,因此无需手动添加它。

system.data.dll 程序集包含以下命名空间,编译 CLR 数据库对象需要这些命名空间:

System.Data

System.Data.Sql

Microsoft.SqlServer.Server

System.Data.SqlTypes

编写简单的“Hello World”存储过程

将以下 Visual C# 或Microsoft Visual Basic 代码复制并粘贴到文本编辑器中,并将其保存在名为“helloworld.cs”或“helloworld.vb”的文件中。

using System;  
using System.Data;  
using Microsoft.SqlServer.Server;  
using System.Data.SqlTypes;  
  
public class HelloWorldProc  
{  
    [Microsoft.SqlServer.Server.SqlProcedure]  
    public static void HelloWorld(out string text)  
    {  
        SqlContext.Pipe.Send("Hello world!" + Environment.NewLine);  
        text = "Hello world!";  
    }  
}  
Imports System  
Imports System.Data  
Imports Microsoft.SqlServer.Server  
Imports System.Data.SqlTypes  
Imports System.Runtime.InteropServices  
  
Public Class HelloWorldProc  
    <Microsoft.SqlServer.Server.SqlProcedure> _   
    Public Shared  Sub HelloWorld(<Out()> ByRef text as String)  
        SqlContext.Pipe.Send("Hello world!" & Environment.NewLine)  
        text = "Hello world!"  
    End Sub  
End Class  
  

此简单程序包含公共类上的单个静态方法。 此方法使用两个新类, SqlContext 以及 SqlPipe用于创建托管数据库对象以输出简单的文本消息。 该方法还会将字符串“Hello world!”指定为 out 参数的值。 此方法可以在 Transact-SQL 存储过程中声明为存储过程。

现在,我们将将此程序编译为库,将其加载到 SQL Server 中,并将其作为存储过程运行。

编译“Hello World”存储过程

默认情况下,Microsoft .NET Framework 重新分发文件。 这些文件包括 csc.exe 和 vbc.exe、Visual C# 和 Visual Basic 程序的命令行编译器。 若要编译我们的示例,必须修改路径变量以指向包含 csc.exe 或 vbc.exe的目录。 下面是 .NET Framework 的默认安装路径。

C:\Windows\Microsoft.NET\Framework\(version)  

版本包含已安装的 .NET Framework 可再发行版本的版本号。 例如:

C:\Windows\Microsoft.NET\Framework\v2.0.31113  

将 .NET Framework 目录添加到路径后,可以使用以下命令将示例存储过程编译到程序集中。 使用 /target 此选项可将它编译到程序集中。

对于 Visual C# 源文件:

csc /target:library helloworld.cs   

对于 Visual Basic 源文件:

vbc /target:library helloworld.vb  

这些命令使用 /target 选项启动 Visual C# 或 Visual Basic 编译器,以指定生成库 DLL。

在 SQL Server 中加载并运行“Hello World”存储过程

成功编译示例过程后,可以在 SQL Server Management Studio 中对其进行测试,并创建新的查询,连接到合适的测试数据库(例如 AdventureWorks 示例数据库)。

默认情况下,执行公共语言运行时 (CLR) 代码的功能在 SQL Server 中设置为 OFF。 可以使用 sp_configure 系统存储过程启用 CLR 代码。 有关详细信息,请参阅 Enabling CLR Integration

我们需要创建程序集,以便可以访问存储过程。 在此示例中,我们将假定已在 C:\ 目录中创建了 helloworld.dll 程序集。 将以下 Transact-SQL 语句添加到查询。

CREATE ASSEMBLY helloworld from 'c:\helloworld.dll' WITH PERMISSION_SET = SAFE  

创建程序集后,现在可以使用 create 过程语句访问 HelloWorld 方法。 我们将调用存储过程“hello”:

  
CREATE PROCEDURE hello  
@i nchar(25) OUTPUT  
AS  
EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld  
-- if the HelloWorldProc class is inside a namespace (called MyNS),  
-- the last line in the create procedure statement would be  
-- EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld  

创建过程后,可以像使用 Transact-SQL 编写的普通存储过程一样运行该过程。 请执行以下命令:

DECLARE @J nchar(25)  
EXEC hello @J out  
PRINT @J  

这应在 SQL Server Management Studio 消息窗口中生成以下输出。

Hello world!  
Hello world!  

删除“Hello World”存储过程示例

运行完示例存储过程后,可以从测试数据库中删除该过程和程序集。

首先,使用 drop procedure 命令删除该过程。

IF EXISTS (SELECT name FROM sysobjects WHERE name = 'hello')  
   drop procedure hello  

删除过程后,可以删除包含示例代码的程序集。

IF EXISTS (SELECT name FROM sys.assemblies WHERE name = 'helloworld')  
   drop assembly helloworld  

另请参阅

CLR 存储过程
SQL Server In-Process ADO.NET 的特定扩展
调试 CLR 数据库对象
CLR 集成安全性