原文:在SQL Server 2008中调用.net,dll

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
{
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);
}
}
}

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

  • 下面打开SQL Server 2008的管理界面,我们需要把这个dll部署到数据库中,然后再注册一个方法,但是在这之前需要在SQL Server中开启CLR调用功能,运行下面的SQL 语句:
    exec sp_configure 'clr enabled', 1;
    reconfigure;
  • 运行下面的语句从这个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

  • 再写一个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 [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]这样才可以运行上面的语句,否则报错说找不到程序集中相关的类,至今不解,甚是迷惑。

  • 现在我们就可以像其他的SQL函数一样来调用这个函数了,下面举一些调用的例子。
  • 这个很简单了,就是将China中的字母z替换成z。

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

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

    在SQL Server 2008中调用.net,dll的更多相关文章

    1. SQL点滴15—在SQL Server 2008中调用C#程序

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

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

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

    3. SQL Server 2008中的数据压缩

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

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

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

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

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

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

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

    7. SQL Server 2008中数据压缩

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

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

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

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

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

    随机推荐

    1. POJ1080 Human Gene Functions 动态规划 LCS的变形

      题意读了半年,唉,给你两串字符,然后长度不同,你能够用'-'把它们补成同样长度,补在哪里取决于得分,它会给你一个得分表,问你最大得分 跟LCS非常像的DP数组 dp[i][j]表示第一个字符串取第i个 ...

    2. JSP简单的练习-使用JDOM阅读xml文件

      <%@ page contentType="text/html; charset=gb2312" language="java" %> <%@ ...

    3. Python基本语法[二],python入门到精通[四] (转)

      写在前面 python你不去认识它,可能没什么,一旦你认识了它,你就会爱上它 回到顶部 v正文开始:Python基本语法 1.定义常量: 之所以上篇博客介绍了定义变量没有一起介绍定义常量,是因为Pyt ...

    4. Node.js新手教程——怎样实现文件上传功能

      作者:zhanhailiang 日期:2014-11-16 本文将介绍怎样使用Node.js实现文件上传功能. 1. 初始化项目信息:npm init [root@~/wade/nodejs/node ...

    5. VS2015, .NET 4.6, C# 6.0, F# 4.0等重量级产品正式上线

      VS2015, .NET 4.6, C# 6.0, F# 4.0等重量级产品正式上线 Visual Studio Visual Studio 2015 下载 VS2015新功能列表 ‘ Visual ...

    6. BZOJ 1801 AHOI2009 中国象棋 递归

      标题效果:给定一个棋盘.放置一些枪.它需要随机两支枪不能互相攻击,评估的数目p模值 首先,两炮不攻击对方自由地等同于一条线最多可有只有两个枪 直形压力DP话是50分 考虑到每个列是等效 然后我们就可以 ...

    7. Asp.Net MVC 2.0 Filter基本用法

      在这一节里,大家一同学习下mvc 2.0中的filter,简单的说,filter就是标记在action上的一些属性,来实现对action的控制. mvc2.0中主要包括以下filter 1. Auth ...

    8. UIDocumentInteractionController 文件预览

      //创建并从底部弹出来 - (void)viewDidLoad { [super viewDidLoad]; [self setupDocumentControllerWithURL:fileURL] ...

    9. Web文件(图片)上传方法

      在开放Web应用程序的时候经常会遇到图片或者是文件上传的模块,这里就是该模块的实现的后台方法 上传图片方法 /// <summary> /// 功能:上传图片方法 /// </sum ...

    10. Forms身份验证和基于Role的权限验证

      Forms身份验证和基于Role的权限验证 从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Memb ...