Hello World 範例示範建立、部署及測試簡單 Common Language Runtime (CLR) 整合型預存程式所涉及的基本作業。 此範例也會示範如何透過記錄傳回數據,該記錄是由預存程式動態建構並傳回給呼叫端。
預 HelloWorld 存程式會傳回結果集中包含一個數據列的字串 “Hello world!” 。 此範例說明 Microsoft.SqlServer.Server.SqlMetaData、 Microsoft.SqlServer.Server.SqlDataRecord 和 Microsoft.SqlServer.Server.Pipe 類別的一些用法。
先決條件
若要建立並執行此專案,必須安裝下列軟體:
SQL Server 或 SQL Server Express。 您可以從 SQL Server Express 檔和範例網站免費取得 SQL Server Express
SQL Server 開發人員網站提供的 AdventureWorks 資料庫
.NET Framework SDK 2.0 或更新版本或Microsoft Visual Studio 2005 或更新版本。 您可以免費取得 .NET Framework SDK。
此外,必須符合下列條件:
您使用的 SQL Server 實例必須啟用 CLR 整合。
若要啟用 CLR 整合,請執行下列步驟:
啟用 CLR 整合
- 執行下列 Transact-SQL 命令:
sp_configure 'clr enabled', 1GORECONFIGUREGO備註
若要啟用 CLR,您必須具有
ALTER SETTINGS由 和sysadmin固定伺服器角色成員serveradmin隱含持有的伺服器層級許可權。AdventureWorks 資料庫必須安裝在您使用的 SQL Server 實例上。
如果您不是您使用之 SQL Server 實例的系統管理員,您必須有系統管理員授與 CreateAssembly 許可權才能完成安裝。
建立範例
使用下列指示建立並執行範例:
開啟 Visual Studio 或 .NET Framework 命令提示字元。
如有必要,請為您的範例建立目錄。 在此範例中,我們將使用 C:\MySample。
在 c:\MySample 中,建立
HelloWorld.vb(針對 Visual Basic 範例) 或HelloWorld.cs[C# 範例] ,並將適當的 Visual Basic 或 C# 範例程式代碼 (以下) 複製到 檔案中。視您選擇的語言而定,從命令行提示字元編譯範例程式代碼,方法是執行下列其中一項。
vbc C:HelloWorld.vb /target:librarycsc /target:library HelloWorld.cs
將 Transact-SQL 安裝程式代碼複製到檔案中,並將它儲存為
Install.sql範例目錄中。執行 來部署元件和預存程式
sqlcmd -E -I -i install.sql -v root = "C:\MySample\"
將 Transact-SQL 測試命令文本複製到檔案中,並將其儲存為
test.sql範例目錄中。使用下列命令執行測試腳本
sqlcmd -E -I -i test.sql
將 Transact-SQL 清除文本複製到檔案中,並將其儲存為
cleanup.sql範例目錄中。使用下列命令執行腳本
sqlcmd -E -I -i cleanup.sql
範例程式碼
以下是此範例的程式代碼清單。
C#
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void HelloWorld()
{
Microsoft.SqlServer.Server.SqlMetaData columnInfo
= new Microsoft.SqlServer.Server.SqlMetaData("Column1", SqlDbType.NVarChar, 12);
SqlDataRecord greetingRecord
= new SqlDataRecord(new Microsoft.SqlServer.Server.SqlMetaData[] { columnInfo });
greetingRecord.SetString(0, "Hello world!");
SqlContext.Pipe.Send(greetingRecord);
}
};
Visual Basic
Imports System
Imports System.Data
Imports System.Data.Sql
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
Partial Public NotInheritable Class StoredProcedures
<Microsoft.SqlServer.Server.SqlProcedure()> _
Public Shared Sub HelloWorld()
Dim columnInfo As New Microsoft.SqlServer.Server.SqlMetaData("Column1", _
SqlDbType.NVarChar, 12)
Dim greetingRecord As New SqlDataRecord(New _
Microsoft.SqlServer.Server.SqlMetaData() {columnInfo})
greetingRecord.SetString(0, "Hello World!")
SqlContext.Pipe.Send(greetingRecord)
End Sub
End Class
這是 Transact-SQL 安裝文本 (Install.sql),它會部署元件,並在資料庫中建立預存程式。
USE AdventureWorks
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')
DROP PROCEDURE usp_HelloWorld;
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'HelloWorld')
DROP ASSEMBLY HelloWorld;
GO
DECLARE @SamplesPath nvarchar(1024)
set @SamplesPath = '$(root)'
CREATE ASSEMBLY HelloWorld
FROM @SamplesPath + 'HelloWorld.dll'
WITH permission_set = Safe;
GO
CREATE PROCEDURE usp_HelloWorld
--(
-- @Greeting nvarchar(12) OUTPUT
--)
AS EXTERNAL NAME HelloWorld.[StoredProcedures].HelloWorld;
GO
這是 test.sql,其會執行預存程式來測試範例。
use AdventureWorks
go
execute usp_HelloWorld
USE AdventureWorks;
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')
DROP PROCEDURE usp_HelloWorld;
GO
下列 Transact-SQL 會從資料庫移除元件和預存程式。
USE AdventureWorks
GO
IF EXISTS (SELECT * FROM sys.procedures WHERE [name] = 'usp_HelloWorld')
DROP PROCEDURE usp_HelloWorld;
GO
IF EXISTS (SELECT * FROM sys.assemblies WHERE [name] = 'HelloWorld')
DROP ASSEMBLY HelloWorld;
GO