在SQL Server 2005中執行CLR
阿新 • • 發佈:2019-02-17
一個簡單的建立SQLCLR的例項:
- SQL:啟用SQLCLR
EXEC sp_configure 'clr enabled', 1-- 在預設情況下,SQL Server 2005中該屬性是置為0的。ReconfigureWith Override - 建立原始碼
對於SQLCLR其是使用CLR語言來編寫儲存過程(函式以及觸發器等,本質上還是儲存過程)。故其是面向過程的,其只能呼叫類的方法,且必須是 public 且 static 的方法,SQLCLR不會去建立一個類的例項。
以下是一個簡單的.cs檔案編譯成.dll後加載入SQL Server
///////////////////////////////////////////////////////////////////////// ** HiCsWorld.cs **using System;
{
publicstaticclass CsTestClass
{
publicstaticvoid SayHi()
{
SqlContext.Pipe.Send("Hi C# World from SQL Server!"); // 呼叫SqlContext上下文物件輸出一行文字 }
publicstaticvoid GetCsGreeting(string name, out
greeting = String.Format("Hello from C#, {0}", name);
}
}
}
/////////////////////////////////////////////////////////////////////// 在上述程式碼中,使用了上下文物件。這種物件用於訪問已啟用的SQLCLR環境。 - 安裝程式集並註冊儲存過程
--------------------------------------------------------------------Create Assembly CsProcs From'C:SQLCLR_SampleHiCsWorld.dll'With Rermission_Set
GoCreateProcedure SayCsHi
As External Name CsProcs.[CsTestNamespace.CsTestClass].SayHi
--------------------------------------------------------------------
註冊程式集時,可以設定三種執行許可權:
SAFE 只能訪問CLR程式碼和資料庫中的資料。不能訪問非託管程式碼、外部資源和執行緒管理。
Exteernal_Access 可以訪問外部資源(檔案系統、事件日誌、網路以及其他資料庫伺服器)。不能訪問非託管程式碼。
UNSAFE 對訪問物件不做任何限制,在有COM元件時必須使用該安全級別。
注:對於後兩種執行許可權,必須將資料庫的Trustworthy屬性置為On。
AlterDatabase Northwind Set Trustworthy On以下是一個帶引數的儲存過程示例:(.dll檔案即上述"HiCsWorld.cs")
CreateProcedure GetCsGreeting -- 建立儲存過程@namenvarchar(50),@greetingnvarchar(100)
As External Name CsProcs.[CsTestNamespace.CsTestClass].GetCsGreeting
Declare@Resultnvarchar(100) -- 呼叫該儲存過程,注意輸出引數的使用Exec GetCsGreeting 'Current User', @Result Output
Select@Result
以下是一個返回行集(Table)資料的CLRSQL儲存過程
///////////////////////////////////////////////////////////////////////// ** HiCsWorld.cs **using System;using System.Data;
using System.Data.Sql;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
namespace CsTestNamespace
{
publicstaticclass CsTestClass
{
publicstaticvoid GetWords(Int32 rowSum)
{
SqlDataRecord rec =new SqlDataRecord(
new SqlMetaData("Index", SqlDbType.Int),
new SqlMetaData("Word", SqlDbType.NVarChar, 50)); // 定義列的結構
SqlContext.Pipe.SendResultsStart(rec);
for (Int32 i =0; i < rowSum; i++)
{
rec.SetInt32(0, i);
rec.SetString(1, String.Format("Word{0,2}", i.ToString()));
SqlContext.Pipe.SendResultsRow(rec); // 逐行寫入列值 }
SqlContext.Pipe.SendResultsEnd();
}
}
}
///////////////////////////////////////////////////////////////////////