现在的位置: 首页 > 综合 > 正文

sql2005+调用c#扩展

2012年11月01日 ⁄ 综合 ⁄ 共 2895字 ⁄ 字号 评论关闭

无意中得到一个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

抱歉!评论已关闭.