sql2005+调用c#扩展
无意中得到一个pdf,上边写着数据库中可以写正则 ,看下边代码
select * from userinfo where username like 'A%P' or username like 'B%P' or username like 'C%P'
可以被下边的替换
select * from userinfo where REGEXP_LIKE(username,'^[A,C]p$')
create table userinfo(username nvarchar(50),password nvarchar(20),email nvarchar(50) not null,
phone nvarchar(50) not null,hobbies nvarchar(2000))
insert into userinfo(username,password,email,phone,hobbies)values
('jason','steve123','neena@neena.com','515-123-4567','football,writing,Cricket')
insert into userinfo(username,password,email,phone,hobbies)values
('jason','steve123','neena@neena.com','515-123-4567','football,writing,Cricket')
insert into userinfo(username,password,email,phone,hobbies)values
('BjasonP','steve123','neena@neena.com','515-123-4567','football,writing,Cricket')
insert into userinfo(username,password,email,phone,hobbies)values
('AjasonP','steve123','neena@neena.com','515-123-4567','football,writing,Cricket')
select * from userinfo where REGEXP_LIKE(username,'^[A,C]p$')
select * from userinfo where username like 'A%P' or username like 'B%P' or username like 'C%P'
oracle支持REGEXP_LIKE、mysql支持REGEXP,可悲的sqlserver不支持.....
oracle的童鞋可以试下上边的代码 应该是没有问题的 因为没有环境测试不了
--------------------------------------
跟群友讨论得出以下结果:可以用c#写扩展..
sql从05开始支持用C#写扩展的
这样直接可以用C#的正则表达式了
以前都是通过esp实现
我只写过几次esp
用delphi的时候
sp = stored procedure 存储过程
esp = extand stored procedure 俗称,扩展存储过程
一般是用其他语言写的,符合sql接口的函数,用dll封装起来
可以在sql中调用
从05开始,这种方案就不推荐了
因为可以直接用C#写了
顺便讨论了下clr
clr的全称是 common language runtime
IL就是编译好的,存在dll里面的
C#代码编程成IL代码,而不是native代码
包括IL代码的dll,由clr来调用
native代码是可以直接执行的
clr把il代码通过jit编译成native执行
多了一层,所以比native效率低一点
native:本机
--------------------------------------
然后碰巧看到这个http://www.cnblogs.com/tylerdonet/archive/2011/05/26/2058980.html#2244667
然后俺第一个模仿的c#扩展新鲜出炉了 以下是 数据库操作部分 c#部分上边的链接里有
c#部分新建一个类库 写上下边第一部分代码生成dll 记住路径 就OK了 剩下的事交给sql
c#
using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlTypes;
using System.Text.RegularExpressions;
using Microsoft.SqlServer.Server;
namespace RegExp
{
public partial class RegExp
{
[SqlFunction(IsDeterministic = true, DataAccess = DataAccessKind.None)]
public static SqlString RegexReplace(SqlString input, SqlString pattern, SqlString replacement)
{
return (SqlString)Regex.Replace(input.Value, pattern.Value, replacement.Value);
}
}
}
sql
--在SQL Server中开启CLR调用功能
exec sp_configure 'clr enabled', 1;
reconfigure;
---------------------
--use master;
--运行下面的语句从这个dll中抽取中间语言(IL)注意路径
create assembly RegExp from 'D:\学习\lianxi\Regex\Regex\bin\Debug\Regex.dll'
---------------------------------------------------
--写个函数引用外部程序集
create function dbo.RegexReplace(
@input as nvarchar(max),
@pattern as nvarchar(max),
@replacement as nvarchar(max))
returns nvarchar(max)
with returns null on null input--只要调用函数的时候任何一个参数为null,函数返回值将会是null。
external name [RegExp].[RegExp.RegExp].[RegexReplace]--[程序集].[命名空间.类].[方法](我认为是这样-_-)
go
------------------------
--将China中的字母z替换成z
select dbo.RegexReplace('china','a','Z')
是不是觉得很强大呢
如果很复杂的sql 可以使用这种方法
想了解更多的在SQL Server中使用assemblies 点击下边的链接:
英文版的 俺是英盲 不过里边的代码还是稍微能看懂的 这不帮助原作者指出了错误了么
您如果看到中文版 请再文后回复 Thank you