一个简单的创建SQLCLR的实例:#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
  • SQL:启用SQLCLR#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            EXEC#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    sp_configure
    'clr enabled', 1#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    -- 在默认情况下,SQL Server 2005中该属性是置为0的。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Reconfigure With#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Override
    #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
  • 创建源代码#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    对于SQLCLR其是使用CLR语言来编写存储过程(函数以及触发器等,本质上还是存储过程)。故其是面向过程的,其只能调用类的方法,且必须是 public 且 static 的方法,SQLCLR不会去创建一个类的实例。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    以下是一个简单的.cs文件编译成.dll后加载入SQL Server#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            ///////////////////////////////////////////////////////////////////////#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    // ** HiCsWorld.cs **#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    using#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    System;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    using#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Microsoft.SqlServer.Server;
    // 该名称空间位于System.Data.dll程序集中#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    namespace#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    CsTestNamespace#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    {#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
     
    public static class CsTestClass#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
      {#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
    public static void SayHi()#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        {#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
          SqlContext.Pipe.Send(
    "Hi C# World from SQL Server!"); // 调用SqlContext上下文对象输出一行文本#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
    public static void GetCsGreeting(string#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    name,
    out string#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    greeting)
    // 用以创建带参数的存储过程#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        {#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
          greeting
    = String.Format("Hello from C#, {0}", name);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
      }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    ///////////////////////////////////////////////////////////////////////#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        在上述代码中,使用了上下文对象。这种对象用于访问已激活的SQLCLR环境。
  • 安装程序集并注册存储过程#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
            --------------------------------------------------------------------#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Create#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Assembly CsProcs
    From#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    'C:SQLCLR_SampleHiCsWorld.dll'#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    With#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Rermission_Set
    =SAFE#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Go#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Create#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    Procedure SayCsHi#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    As#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    External Name CsProcs.
    [CsTestNamespace.CsTestClass].SayHi#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    --------------------------------------------------------------------#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        #ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
注册程序集时,可以设置三种执行权限:#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
SAFE 只能访问CLR代码和数据库中的数据。不能访问非托管代码、外部资源和线程管理。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
Exteernal_Access 可以访问外部资源(文件系统、事件日志、网络以及其他数据库服务器)。不能访问非托管代码。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
UNSAFE 对访问对象不做任何限制,在有COM组件时必须使用该安全级别。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
注:对于后两种执行权限,必须将数据库的Trustworthy属性置为On。#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
Alter Database Northwind Set#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
Trustworthy
On#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
以下是一个带参数的存储过程示例:(.dll文件即上述"HiCsWorld.cs")#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
Create Procedure GetCsGreeting -- 创建存储过程#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
@name#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
nvarchar(50),#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
 
@greeting#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
nvarchar(100)#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
As External Name CsProcs.[CsTestNamespace.CsTestClass].GetCsGreeting#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
Declare#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
@Result#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
nvarchar(100) -- 调用该存储过程,注意输出参数的使用#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
Exec GetCsGreeting 'Current User', @Result Output#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
Select#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
@Result#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
以下是一个返回行集(Table)数据的CLRSQL存储过程#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
///////////////////////////////////////////////////////////////////////#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
// ** HiCsWorld.cs **#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
using#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
System;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
using#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
System.Data;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
using#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
System.Data.Sql;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
using#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
System.Data.SqlTypes;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
using Microsoft.SqlServer.Server;#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
namespace CsTestNamespace#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
{#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
 
public static class CsTestClass#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
  {#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
   
public static void GetWords(Int32 rowSum)#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    {#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
      SqlDataRecord rec
= new SqlDataRecord(#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
new SqlMetaData("Index", SqlDbType.Int),#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
       
new#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
SqlMetaData(
"Word", SqlDbType.NVarChar, 50)); // 定义列的结构#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
      SqlContext.Pipe.SendResultsStart(rec);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
     
for#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
(Int32 i
= 0; i < rowSum; i++)#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
      {#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        rec.SetInt32(
0, i);#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        rec.SetString(
1, String.Format("Word{0,2}", i.ToString()));#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
        SqlContext.Pipe.SendResultsRow(rec);
// 逐行写入列值#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
      }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
      SqlContext.Pipe.SendResultsEnd();#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
    }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
  }#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®
}
#ðӛhüÑ\‡www.netcsharp.cnÀËóùòËYâ®