原文: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. 第22题 Rotate List

    Given a list, rotate the list to the right by k places, where k is non-negative. For example: Given  ...

  2. 新秀学习Hibernate——一个简单的例子

    一个.Hibernate开发. 上篇博客已经为大家介绍了持久层框架的发展流程,持久层框架的种类. 为了可以使用Hibernate高速上手,我们先解说一个简单的Hibernate应用实例hibernat ...

  3. ANDROID嵌入式应用Unity3D视图(画廊3D模型)

    转载请注明来自大型玉米的博客文章(http://blog.csdn.net/a396901990),谢谢支持! 效果展示:   watermark/2/text/aHR0cDovL2Jsb2cuY3N ...

  4. hdu4770:Lights Against Dudely(回溯 + 修剪)

    称号:hdu4770:Lights Against Dudely 题目大意:相同是n*m的矩阵代表room,房间相同也有脆弱和牢固之分,如今要求要保护脆弱的房间.须要将每一个脆弱的房间都照亮,可是牢固 ...

  5. matlab入门 蜂窝阵列

    B{1,1}=[1,2]; B{1,2}='kitty'; B B = [1x2 double]    'kitty' celldisp(B) B{1} =      1     2 B{2} =   ...

  6. webserver实现

    最近的工作需求client和server使用https协议进行通讯,我负责client编写程序,在操作系统的-depth理解认为一旦前webserver实现,整理代码: #include"a ...

  7. 批处理删除IIS的everyone、users的访问权限

    原文 批处理删除IIS的everyone.users的访问权限 以下批处理代码功能,实现的是,删除C盘的everyone.users用户对IIS的权限. 一.删除C盘的everyone的权限 cd/  ...

  8. ECLIPSE IDEA 调音 1

    为自己所用IDE进行jvm优 首先进行日志输出配置 Eclipse  改动eclipse.ini IDEA   改动 idea.exe.vmoptions 添加打印日志的配置參数 -XX:+Print ...

  9. Oracle EBS WMS特征(一)

    Oracle EBS WMS特征(一) (版权声明.我的原创或翻译的文章,如需转载,转载用于个人学习,转载请注明出处:否则,请与我联系,版权所有) Oracle WMS这是一个仓库管理,它是Oracl ...

  10. C++ 之 exception

    本文讲关于C++的异常的全部东西: 绝对不让异常逃离析构函数 阻止exception逃离析构函数,主要是两个原因: 1 防止在异常处理过程中的栈展开行为时,将调用terminate函数.程序将会结束, ...