1. 程式人生 > >在SQL Server 2005中執行CLR

在SQL Server 2005中執行CLR

一個簡單的建立SQLCLR的例項:

  1.  SQL:啟用SQLCLR
    EXEC sp_configure 'clr enabled'1-- 在預設情況下,SQL Server 2005中該屬性是置為0的。ReconfigureWith Override
  2. 建立原始碼
    對於SQLCLR其是使用CLR語言來編寫儲存過程(函式以及觸發器等,本質上還是儲存過程)。故其是面向過程的,其只能呼叫類的方法,且必須是 public 且 static 的方法,SQLCLR不會去建立一個類的例項。
    以下是一個簡單的.cs檔案編譯成.dll後加載入SQL Server
    ///////////////////////////////////////////////////////////////////////// ** HiCsWorld.cs **using System;
    using Microsoft.SqlServer.Server; // 該名稱空間位於System.Data.dll程式集中namespace CsTestNamespace
    {
      
    publicstaticclass CsTestClass
      {
        
    publicstaticvoid SayHi()
        {
          SqlContext.Pipe.Send(
    "Hi C# World from SQL Server!"); // 呼叫SqlContext上下文物件輸出一行文字    }

        
    publicstaticvoid GetCsGreeting(string name, out
    string greeting) // 用以建立帶引數的儲存過程    {
          greeting 
    = String.Format("Hello from C#, {0}", name);
        }
      }
    }
    /////////////////////////////////////////////////////////////////////// 在上述程式碼中,使用了上下文物件。這種物件用於訪問已啟用的SQLCLR環境。
  3. 安裝程式集並註冊儲存過程
    --------------------------------------------------------------------Create Assembly CsProcs From'C:SQLCLR_SampleHiCsWorld.dll'With Rermission_Set
    =SAFE
    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();
    }
  }
}
///////////////////////////////////////////////////////////////////////