共用方式為


CLR 整合使用者入門

適用於:SQL Server

本文概述使用 SQL Server 與 .NET Framework Common Language Runtime (CLR) 整合編譯資料庫物件所需的命名空間和連結庫。 本文也會說明如何撰寫、編譯和執行以 C# 和 Visual Basic .NET 撰寫的小型 CLR 預存程式。

必要命名空間

開發基本 CLR 資料庫物件所需的元件會與 SQL Server 一起安裝。 CLR 整合功能會在稱為 System.Data.dll (.NET Framework 的一部分) 的組件中公開。 此元件可在全域程式集緩存 (GAC) 和 .NET Framework 目錄中找到。 一般而言,命令列工具和 Visual Studio 會自動新增此組件的參考,因此不需要手動新增。

System.Data.dll 組件包含下列編譯 CLR 資料庫物件所需的命名空間:

  • System.Data
  • System.Data.Sql
  • Microsoft.SqlServer.Server
  • System.Data.SqlTypes

提示

支援在Linux上載入 CLR 資料庫物件,但必須使用 .NET Framework 來建置它們(SQL Server CLR 整合不支援 .NET Core 或 .NET 5 和更新版本)。 此外,Linux 不支援具有 EXTERNAL_ACCESSUNSAFE 許可權集合的 CLR 元件。

撰寫 "Hello World" 預存程序

將下列 C# 或 Visual Basic .NET 程式代碼複製並貼到文字編輯器中,並將它儲存在名為 helloworld.cshelloworld.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!";
    }
}

此程式包含公用類別上的單一靜態方法。 此方法會使用 SqlContextSqlPipe 這兩個新類別來建立受控資料庫物件以輸出簡短的文字訊息。 此方法也會將 "Hello world!" 字串指派為 out 參數的值。 此方法可以宣告為 SQL Server 中的預存程序,然後以與 Transact-SQL 預存程序相同的方法執行。

將此程式編譯為程式庫,並將其載入 SQL Server,然後做為預存程序來執行它。

編譯 "Hello World" 預存程序

依預設,SQL Server 會安裝 .NET Framework 轉散佈檔案。 這些檔案包括 csc.exevbc.exe,C# 和 Visual Basic .NET 程式的命令行編譯程式。 若要編譯此範例,您必須修改路徑變數,使其指向包含 csc.exevbc.exe 的目錄。 以下路徑為 .NET Framework 的預設安裝路徑。

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

Version 包含已安裝之 .NET Framework 的版本號碼。 例如:

C:\Windows\Microsoft.NET\Framework\v4.8.0

將 .NET Framework 目錄新增至路徑之後,您可以使用下列命令,將範例預存程式編譯成元件。 /target 選項可讓您將其編譯為組件。

針對 C# 原始程式檔:

csc /target:library helloworld.cs

針對 Visual Basic .NET 原始程式碼檔案:

vbc /target:library helloworld.vb

這些命令會使用 /target 選項來啟動 C# 或 Visual Basic .NET 編譯器,指定建構程式庫 DLL。

在 SQL Server 中載入並執行 "Hello World" 預存程序

成功編譯範例程序之後,您就可以在 SQL Server 中進行測試。 若要執行此動作,請連接至適用的測試資料庫 (例如 AdventureWorks2022 範例資料庫),然後開啟 SQL Server Management Studio 並建立新查詢。

在 SQL Server 中,執行 Common Language Runtime (CLR) 程式碼的功能預設為 OFF。 您可以使用 sp_configure 系統預存程序來啟用 CLR 程式碼。 如需詳細資訊,請參閱 啟用 CLR 整合

我們需要建立組件,才能存取預存程式。 在此範例中,我們假設您已在 C:\ 目錄中建立 helloworld.dll 元件。 將下列 Transact-SQL 陳述式加入至查詢。

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

建立元件之後,我們現在可以使用 CREATE PROCEDURE 語句來存取 HelloWorld 方法。 我們將預存程式稱為 hello

CREATE PROCEDURE hello
(@i NCHAR (25) OUTPUT)
AS EXTERNAL NAME helloworld.HelloWorldProc.HelloWorld;

注意

在上一個範例中,如果 HelloWorldProc 類別位於命名空間內(稱為 MyNS),則 create procedure 語句中的最後一行會 EXTERNAL NAME helloworld.[MyNS.HelloWorldProc].HelloWorld;

建立程序之後,就可以像以 Transact-SQL 撰寫的一般預存程式一樣執行。 執行下列命令:

DECLARE @J AS NCHAR (25);
EXECUTE hello @J OUTPUT;
PRINT @J;

以下是預期的輸出。

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;