一个简单的创建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);
}
}
}
/ // - 安装程序集并注册存储过程
-- ------------------------------------------------------------------
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
@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();
}
}
}
/ //
// ** 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();
}
}
}
/ //