原文:SQL点滴15—在SQL Server 2008中调用C#程序

  

T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了。这时可以借助CLR了,我们可以在SQL Server 2008中扩展C#程序来完成循环等过程式的查询,或者其他SQL不便实现的功能。这个随笔中将介绍在SQL Server中扩展C#程序实现正则表达式的替换功能。

  1. 新建一个类库程序命名为Regex,打开Visual Studio 2008,点击File,点击New,点击Project,在弹出的New Project对话框中选择Class Library,项目名称为Regex。
  2. 将项目中的类Class1命名为Regex,在这个类中写入如下代码:
    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Data.SqlTypes;using System.Text.RegularExpressions;using Microsoft.SqlServer.Server;namespace RegExp{publicpartialclass RegExp{[SqlFunction(IsDeterministic =true, DataAccess = DataAccessKind.None)]publicstatic SqlString RegexReplace(SqlString input, SqlString pattern, SqlString replacement){return (SqlString)Regex.Replace(input.Value, pattern.Value, replacement.Value);}}}
    

    这个类中使用System.Text.RegularExpressions.Regex类中的Replace函数,这个在C#是常用的一个函数,使用正则表达式实现替换功能。编译这个类库项目生成RegExp.dll,这个在后面会用到的。

  3. 下面打开SQL Server 2008的管理界面,我们需要把这个dll部署到数据库中,然后再注册一个方法,但是在这之前需要在SQL Server中开启CLR调用功能,运行下面的SQL 语句:
    exec sp_configure 'clr enabled', 1;reconfigure;
    
  4. 运行下面的语句从这个dll中抽取中间语言(IL),如果你自己试验,注意修改dll文件存放路径。
    use AdventureWorks;create assembly RegExp from'D:\MyProject\RegExp\RegExp\bin\Debug\RegExp.dll'
    

    这个时候我们就可以在SQL Server中查看这个集合了,点击展开数据库AdventureWorks,点击展开Programmability,点击展开Assemblies就可以看到Regex,如下图1。

    图1

  5. 再写一个SQL函数来注册这个Assembly,代码如下
    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

    external name [RegExp].[RegExp.RegExp].[RegexReplace]

    go
     

    多谢【青蛙王子】提醒,已经更正
    注意:
    a. 函数是returns而不是return,很容易弄错。
    b.with returns null on null input意思是只要调用函数的时候任何一个参数为null,函数返回值将会是null。
    c. 最后一句引用类库的格式,我本来以为[MyAssemblyName].[MyAssemblyName].[MyMethodName]就可以了,但是需要写成[MyAssemblyName]. [MyAssemblyName.MyClassName].[MyMethodName]这样才可以运行上面的语句,否则报错说找不到程序集中相关的类,至今不解,甚是迷惑。

  6. 现在我们就可以像其他的SQL函数一样来调用这个函数了,下面举一些调用的例子。

    这个很简单了,就是将China中的字母z替换成z。

    这个把运算符+替换成add。

    这个就是那个语句WITH RETURNS NULL ON NULL INPUT的效果了。

SQL点滴15—在SQL Server 2008中调用C#程序的更多相关文章

  1. 在SQL Server 2008中调用.net,dll

    原文:在SQL Server 2008中调用.net,dll T-SQL的在执行普通的查询的时候是很高效的,但是在执行循环,判断这样的语句的时候效率就不那么的高了.这时可以借助CLR了,我们可以在SQ ...

  2. SQL Server 2008中的数据压缩

    SQL Server 2008中引入了数据压缩的功能,允许在表.索引和分区中执行数据压缩.这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁 盘IO,提升查询的性能.当然,凡 ...

  3. SQL Server 2008中新增的 1.变更数据捕获(CDC) 和 2.更改跟踪

    概述 1.变更数据捕获(CDC)        每一次的数据操作都会记录下来 2.更改跟踪       只会记录最新一条记录   以上两种的区别:         http://blog.csdn.n ...

  4. SQL Server 2008中新增的变更数据捕获(CDC)和更改跟踪

    来源:http://www.cnblogs.com/downmoon/archive/2012/04/10/2439462.html  本文主要介绍SQL Server中记录数据变更的四个方法:触发器 ...

  5. SQL Server 2008中增强的"汇总"技巧

    本文转载:http://www.cnblogs.com/downmoon/archive/2012/04/06/2433988.html SQL Server 2008中的Pivot和UnPivot: ...

  6. SQL Server 2008中数据压缩

    SQL Server 2008中引入了数据压缩的功能,允许在表.索引和分区中执行数据压缩.这样不仅可以大大节省磁盘的占用空间,还允许将更多数据页装入内存中,从而降低磁盘IO,提升查询的性能.当然,凡事 ...

  7. 利用Ring Buffer在SQL Server 2008中进行连接故障排除

    原文:利用Ring Buffer在SQL Server 2008中进行连接故障排除 出自:http://blogs.msdn.com/b/apgcdsd/archive/2011/11/21/ring ...

  8. SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑

    SQL Server 2008中的CDC(Change Data Capture)功能使用及释疑 关键词:CDC   原文:http://www.cnblogs.com/chenxizhang/arc ...

  9. SQL Server 2008中的MERGE(不仅仅是合并)

    SQL Server 2008中的MERGE语句能做很多事情,它的功能是根据源表对目标表执行插入.更新或删除操作.最典型的应用就是进行两个表的同步. 下面通过一个简单示例来演示MERGE语句的使用方法 ...

随机推荐

  1. Spring 的@Scheduled注解实现定时任务运行和调度

    Spring 的@Scheduled注解实现定时任务运行和调度 首先要配置我们的spring.xml   ---  即spring的主配置文件(有的项目中叫做applicationContext.xm ...

  2. android可扩展自己的定义,运动图像裁剪框

    在实际项目中,常常要制作一个简易的图像裁剪功能,即获取一张图片.并用一个遮罩层选择目标范围并截取保存的功能.例如以下图所看到的: 在此分享下该自己定义视图的制作过程. 需求说明 整一个视图包括一个透明 ...

  3. SQL Server 2005------函数

    原文:SQL Server 2005------函数 SQL Server 2005支持用户自定义函数和内置系统函数,根据返回值类型又分为标量函数和表值函数. 1.标量函数标量函数:返回单个数据值,返 ...

  4. struts2-dojo-plugin-2.3.1.2.jar!/struts-plugin.xml:29:119

    Unable to load configuration. - bean - jar:file:/D:/code_workspace/SSHWorkSpace3/.metadata/.plugins/ ...

  5. Codeforces Round #271 (Div. 2) E题 Pillars(线段树维护DP)

    题目地址:http://codeforces.com/contest/474/problem/E 第一次遇到这样的用线段树来维护DP的题目.ASC中也遇到过,当时也非常自然的想到了线段树维护DP,可是 ...

  6. ASP.NET MVC应用程序展示RDLC报表

    原文:ASP.NET MVC应用程序展示RDLC报表 学习ASP.NET MVC这样久,在学习,练习与应用过程中,觉得很多知识与以前的ASP.NET多有区别,但是实现操作起来,细处又有许多相近的地方. ...

  7. UVA11992 - Fast Matrix Operations(段树部分的变化)

    UVA11992 - Fast Matrix Operations(线段树区间改动) 题目链接 题目大意:给你个r*c的矩阵,初始化为0. 然后给你三种操作: 1 x1, y1, x2, y2, v ...

  8. Unity最优化摘要

    我们的游戏已经wp8.ios和android平台上的线. 这是我第一次做Unity工程,过程中遇到很多困难和挫折,但是,我和小伙伴探路,现在.该游戏已经上线一段时间.而且很稳定.为Unity.我一直在 ...

  9. HDU 4349 Xiao Ming's Hope

    非常无语的一个题. 反正我后来看题解全然不是一个道上的. 要用什么组合数学的lucas定理. 表示自己就推了前面几个数然后找找规律. C(n, m) 就是 组合n取m: (m!(n-m!)/n!) 假 ...

  10. 微软发布Win10开发者指南视频

    假设你是一个开发者,推荐你看看微软今天推出了一系列视频,标题是Win10开发人员指南,总体长度6时,多达22章内容,介绍很广泛.其实,即使你是编程新手或仅有兴趣,也值得一看. 开发人员Jerry Ni ...