1、用VS建立一个类库,名为CsTestNamespace,并建立一个类CsTestClass。将CsTestClass改成成如下代码,主要是从SQL中返回一串内容。编译程序,将编译后程序更名为HiCsWorld.dll。
namespace CsTestNamespace
{
public class CsTestClass
{
public static void SayHi()
{
SqlContext.Pipe.Send("Hi C# World from SQL Server!");
}
}
}
说明:SqlContext称为“上下文”对象,此对象用于激活SQLCLR环境。Pipe属性用于将数据发送给客户。在SQL中,Print语句等价于Pipe.Send方法。应用程序通过获取SqlConnection对象InfoMessage集合中的数据,就可以访问要发送的数据。
2、在SQL Server上安装程序集。
with Permission_set = safe
说明:Permission_set为程序集的权限。SQLCLR有三种执行权限:
修改程序集的执行权限需要有装饰数据库配置为Trustworthy。如果是数据库管理员不需要配置。配置方法如下:
use master
alter database northwind set trustworthy on
go
修改执行权限
use master
grant external access assembly to [loginName]
go
--获得Unsafe权限
grant unsafe assembly to [loginName]
go
程序集中的方法注册为存储过程、函数等方可使用。现在我们注册为存储过程。
create procedure SayCsHi
as external Name CsProcs.[CsTestNamespace.CsTestClass].SayHi
go
说明:存储过程的外部名称采用的是程序集:类、方法 格式。由SqlServer无法识别命名空间和类,所以使用方括号([])将命名空间.类括起来让Sql Server知道,该括号中的内容代表类的完整路径。
5、执行存储过程
exec SayCsHi
这样一个完整的例子便完成了。
程序集变更时,需要刷新程序集
7、查看所有程序及其权限
select * from sys.assemblies
8、增加传送参数方法
上边的例子中并没有传送参数,现增加传递参数的方法。
1)修改CsTestNamespace.CsTestClass。增加下边两个方法。
/// 传递参数,用ref返回结果
/// </summary>
/// <param name="name"></param>
/// <param name="greeting"></param>
public static void GetGreeting(string name,ref string greeting)
{
greeting = "Hello from C#," + name;
}
/// <summary>
/// 传递参数,用out返回结果
/// </summary>
/// <param name="name"></param>
/// <param name="greeting"></param>
public static void GetGreetingOut(string name, out string greeting)
{
greeting = "Hello from C#," + name;
}
2)更新程序集
3)将最新添加的两个方法注册为存储过程
Create procedure GetCsGreeting
@name nvarchar(50),
@greeting nvarchar(100) output --输出结果
as External name CsProcs.[CsTestNamespace.CsTestClass].GetGreeting
--注册包含参数的C#存储过程(Out)
create procedure GetCsGreetingOut
@name nvarchar(50),
@greeting nvarchar(100) output
as External name CsProcs.[CsTestNamespace.CsTestClass].GetGreetingOut
4)调用
declare @Result nvarchar(100)
Exec GetCsGreeting 'Test',@result output
print @result
//Out 参数
declare @result nvarchar(100)
Exec GetCsGreetingOut 'TestOut',@result output
print @result
-----------------------------------------------------------------------
系列文章目录