在SQL Server 2005中运行CLR

来源:互联网 发布:通辽网络优化工程师 编辑:程序博客网 时间:2024/05/18 03:11

一个简单的创建SQLCLR的实例:

  1.  SQL:启用SQLCLR
    EXEC sp_configure 'clr enabled'1 -- 在默认情况下,SQL Server 2005中该属性是置为0的。
    Reconfigure With Override
  2. 创建源代码
    对于SQLCLR其是使用CLR语言来编写存储过程(函数以及触发器等,本质上还是存储过程)。故其是面向过程的,其只能调用类的方法,且必须是 public 且 static 的方法,SQLCLR不会去创建一个类的实例。
    以下是一个简单的.cs文件编译成.dll后加载入SQL Server
    ///////////////////////////////////////////////////////////////////////
    // ** HiCsWorld.cs **
    using System;
    using Microsoft.SqlServer.Server; // 该名称空间位于System.Data.dll程序集中

    namespace CsTestNamespace
    {
      
    public static class CsTestClass
      {
        
    public static void SayHi()
        {
          SqlContext.Pipe.Send(
    "Hi C# World from SQL Server!"); // 调用SqlContext上下文对象输出一行文本
        }

        
    public static void 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
    Go
    Create Procedure SayCsHi
    As External Name CsProcs.[CsTestNamespace.CsTestClass].SayHi
    --------------------------------------------------------------------

注册程序集时,可以设置三种执行权限:
SAFE 只能访问CLR代码和数据库中的数据。不能访问非托管代码、外部资源和线程管理。
Exteernal_Access 可以访问外部资源(文件系统、事件日志、网络以及其他数据库服务器)。不能访问非托管代码。
UNSAFE 对访问对象不做任何限制,在有COM组件时必须使用该安全级别。

注:对于后两种执行权限,必须将数据库的Trustworthy属性置为On。

Alter Database Northwind Set Trustworthy On

以下是一个带参数的存储过程示例:(.dll文件即上述"HiCsWorld.cs")

Create Procedure GetCsGreeting -- 创建存储过程
  @name nvarchar(50),
  
@greeting nvarchar(100)
As External Name CsProcs.[CsTestNamespace.CsTestClass].GetCsGreeting

Declare @Result nvarchar(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
{
  
public static class CsTestClass
  {
    
public static void 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();
    }
  }
}
///////////////////////////////////////////////////////////////////////

 

原创粉丝点击