CLR 整合使用者入門
本主題提供使用與 Microsoft .NET Framework Common Language Runtime (CLR) 整合的 MicrosoftSQL Server 編譯資料庫物件時,所需之命名空間及程式庫的概觀。此外,本主題還會為您示範如何撰寫、編譯及執行以 Microsoft Visual C# 所撰寫的簡單 CLR 預存程序。
必要命名空間
從 SQL Server 2005 開始,開發基本 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 參數的值。此方法可以宣告為 SQL Server 中的預存程序,然後以與 Transact-SQL 預存程序相同的方法執行。
現在,我們會將此程式編譯為程式庫,並將其載入 SQL Server,然後做為預存程序來執行它。
編譯 "Hello World" 預存程序
依預設,SQL Server 會安裝 Microsoft .NET Framework 轉散佈檔案。這些檔案包括 csc.exe、vbc.exe 及 Visual C# 與 Visual Basic 程式的命令列編譯器。若要編譯此範例,您必須修改路徑變數,使其指向包含 csc.exe 或 vbc.exe 的目錄。以下為 .NET Framework 的預設安裝路徑。
C:\Windows\Microsoft.NET\Framework\(version)
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
這些命令會啟動 Visual C# 或 Visual Basic 編譯器,並使用 /target 選項來指定要建立程式庫 DLL。
在 SQL Server 中載入並執行 "Hello World" 預存程序
成功編譯範例程序後,您就可以在 SQL Server 中對其進行測試。若要這樣做,請連接至適合的測試資料庫 (例如 AdventureWorks 範例資料庫),然後開啟 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
程序建立完成後,就可以使用與執行 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