zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    C++面试题
    kalman滤波原理
    开blog
    Linux图片批处理
    Debian使用相关
    Ubuntu grub引导修复
    Debian系统vim中文显示乱码问题
    Debian配置Apache2支持mod-python和cgi模块
    linux下解压被分割的zip文件
    Ubuntu 16.04 启动错误 "a start job is running for hold until boot process finishes up"
  • 原文地址:https://www.cnblogs.com/0banana0/p/2250477.html
Copyright © 2011-2022 走看看