在SQL Server 2005中运行CLR

一个简单的创建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();
    }
  }
}
/ //

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值