本主題提供使用 SQL Server 與 .NET Framework Common Language Runtime (CLR) 整合編譯資料庫物件所需的命名空間和連結庫概觀。 本主題也會示範如何撰寫、編譯及執行以Visual C# 撰寫 Microsoft的簡單 CLR 預存程式。
必要命名空間
從 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,來建立Managed資料庫對象以輸出簡單的文字訊息。 方法也會將字串 “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 範例資料庫)。
在 SQL Server 中,執行 Common Language Runtime (CLR) 程式代碼的能力預設會設定為 OFF。 您可以使用 sp_configure 系統預存程式來啟用 CLR 程式代碼。 如需詳細資訊,請參閱 Enabling CLR Integration。
我們需要建立元件,才能存取預存程式。 在此範例中,我們將假設您已在 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
-- 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 整合安全性