您的位置:首页 > 数据库

在SQL Server 2005中运行CLR

2008-03-20 18:28 162 查看
一个简单的创建SQLCLR的实例:

SQL:启用SQLCLR

EXEC sp_configure 'clr enabled', 1 -- 在默认情况下,SQL Server 2005中该属性是置为0的。

Reconfigure With Override

创建源代码

对于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环境。
安装程序集并注册存储过程

--------------------------------------------------------------------

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();

}

}

}

///////////////////////////////////////////////////////////////////////
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: