SQL Server2005 支持在.NET中创建一个存储过程或者函数。这种方式对数据库提供一种扩展,大大的增加对数据操作的方便性。例如一些对数据较复杂的操作,用纯sql实现可能相对复杂,而通过C#之类的语言实现就方便了许多。
具体操作上方便,但是第一次做起来在细节上还有好多值得注意的地方。
1,创建一个数据库项目,然后添加要创建的(Function or PROCEDURE也可以是Trigger,用户自定义类型),具体一看便知。
{
/// <summary>
/// 根据正则表达判断是否匹配
/// </summary>
/// <param name="regexExpress"> 正则表达式 </param>
/// <param name="input"> 检查的字符 </param>
/// <returns></returns>
[Microsoft.SqlServer.Server.SqlFunction]
public static bool RegExValidate( string regexExpress, string input)
{
Regex regex = new Regex(regexExpress, RegexOptions.IgnoreCase);
return regex.IsMatch(input);
}
};
这是我的示例,主要功能就是通过传入的字符串和与之对应的正则表达式,检查是否匹配。成功为true,失败为false。
功能函数完成,然后编译。
2,在SQL Server中操作,加载程序集
具体操作:CREATE ASSEMBLY RegexFun from 'c:\sql\SqlServerRegex.dll' WITH PERMISSION_SET = SAFE
操作的时间有权限的限制(摘自SQL Server2008教程 CREATE ASSEMBLY):
注意: dll版本和数据库版本有一定对应关系,Sql Server08 时间 dll不能是.net4.0
3, 当程序集创建成功,需要在数据库创建一个(函数|存储过程)和程序集做一个映射。
CREATE FUNCTION RegexComFun(@str nvarchar(250),@input nvarchar(250))
AS EXTERNAL NAME RegexFun.UserDefinedFunctions. [ RegExValidate ]
注意: string 在T-SQL对应的类型是 nvarchar,(varchar是出现这样错误:的 T-SQL 和 CLR 类型不匹配)
解释:RegexFun.UserDefinedFunctions.[RegExValidate] ( RegexFun 第2步创建的程序集名称,UserDefinedFunctions.[RegExValidate] 类名和方法名)
4,看似一切好了,迫不及待的执行吧
select dbo.RegexComFun(N'\d+',N'123')
结果发生错误:禁止在 .NET Framework 中执行用户代码。启用 "clr enabled" 配置选项
5, 配置"clr enabled"
clr enabled有两个选项:0不允许在 SQL Server 上执行程序集。1允许在 SQL Server 上执行程序集。该设置将在 sp_configure 运行之后立即生效。 不需要重新启动 SQL Server 实例。
reconfigure;
这样配置成功!
注意 : 一定要加 reconfigure , 不然执行可以 成功,但设置不生效。这样配置完毕,在执行select dbo.RegexComFun(N'\d+',N'123')返回1,成功了!