背景

在处理数据或者分析数据时,我们常常需要加入一定的逻辑,该些处理逻辑有些sql是可以支持,有些逻辑SQL则无能为力,在这种情况下,大多数人都会编写相关的程序来处理成自己想要的数据,但每次处理相同逻辑时,都需要运行一次程序非常麻烦。

案例

IE地址栏上的地址在记入日志表中时,其数据是通过编码的,如果我们想要看到明文,则需要相应的解码,可以用SQL语句来实现,如:

摘自:http://blog.csdn.net/ruijc/article/details/6931189

  1. CREATE FUNCTION FN_URLDecode
  2. (
  3. @Str VARCHAR(8000)
  4. )
  5. RETURNS VARCHAR(8000)
  6. AS
  7. BEGIN
  8. DECLARE @Position INT; --'%'字符所在位置
  9. DECLARE @Chr CHAR(16); --字符常量
  10. DECLARE @Pattern CHAR(21);
  11. DECLARE @ParseStr VARCHAR(8000);--解码后的字符串
  12. DECLARE @Hex UNIQUEIDENTIFIER;--定义16进制模板,因为GUID方便转为BYTE
  13. DECLARE @CurrWord INT ;--当前字
  14. DECLARE @BitsCount INT ;--当前解码位数
  15. DECLARE @HightByte TINYINT;--高位字节
  16. DECLARE @LowByte TINYINT;--低位字节
  17.  
  18. SET @Chr = '0123456789abcdef';
  19. SET @Pattern = '%[%][a-f0-9][a-f0-9]%';
  20. SET @ParseStr=@Str;
  21. SET @Hex= '00000000-0000-0000-0000-000000000000';
  22. SET @CurrWord=0;
  23. SET @BitsCount=0;
  24. SET @HightByte=0;
  25. SET @LowByte=0;
  26.  
  27. IF (@Str IS NOT NULL OR @Str<>'')
  28. BEGIN
  29. SET @Position = PATINDEX(@Pattern, @ParseStr);
  30. WHILE @Position>0
  31. BEGIN
  32. SET @Hex=STUFF(@Hex,7,2,LEFT(RIGHT(@ParseStr,len(@ParseStr) - @Position),2));
  33. SET @HightByte=CAST(CAST(@Hex AS BINARY(1)) AS INT);
  34.  
  35. IF (@HightByte & 127=@HightByte)
  36. BEGIN
  37. SET @CurrWord=@HightByte;
  38. SET @BitsCount=1;
  39. END
  40.  
  41. IF (@HightByte & 192=192)
  42. BEGIN
  43. SET @CurrWord=@HightByte & 31 ;
  44. SET @BitsCount=2;
  45. END
  46.  
  47. IF (@HightByte & 224=224)
  48. BEGIN
  49. SET @CurrWord = @HightByte & 15
  50. SET @BitsCount = 3
  51. END
  52.  
  53. IF (@HightByte & 240=240)
  54. BEGIN
  55. SET @CurrWord = @HightByte & 7
  56. SET @BitsCount = 4
  57. END
  58.  
  59. DECLARE @Index INT;
  60. DECLARE @NEWCHAR NVARCHAR(2);
  61. SET @Index=1;
  62. SET @NEWCHAR='';
  63. WHILE @Index<@BitsCount
  64. BEGIN
  65. IF (LEN(@ParseStr)-@Position-3*@Index)<0
  66. BEGIN
  67. SET @ParseStr=@Str ;
  68. SET @Position=0;
  69. BREAK;
  70. END
  71. SET @NEWCHAR = LEFT(RIGHT(@ParseStr,LEN(@ParseStr) - @Position - 3* @Index),2);
  72. IF @NEWCHAR NOT LIKE '[a-f0-9][a-f0-9]'
  73. BEGIN
  74. SET @ParseStr = @Str
  75. SET @Position=0;
  76. BREAK;
  77. END
  78.  
  79. SET @Hex = STUFF(@Hex, 7, 2, @NEWCHAR)
  80.  
  81. SET @LowByte = CAST(CAST(@Hex AS BINARY(1)) AS INT);
  82.  
  83. IF @LowByte&192=192
  84. BEGIN
  85. SET @ParseStr = @Str
  86. SET @Position=0;
  87. BREAK;
  88. END
  89.  
  90. SET @CurrWord = (@CurrWord * 64) | (@LowByte & 63)
  91. SET @Index =@Index+ 1
  92. END
  93.  
  94. IF @BitsCount > 1
  95. SET @ParseStr = STUFF(@ParseStr, @Position, 3*(@BitsCount), NCHAR(@CurrWord))
  96. ELSE
  97. BEGIN
  98. set @ParseStr = STUFF(@ParseStr, @Position, 2, NCHAR(@CurrWord))
  99. set @ParseStr = STUFF(@ParseStr, @Position+1, 1, N'')
  100. END
  101. SET @Position = PATINDEX(@Pattern, @ParseStr);
  102. END
  103. END
  104. RETURN @ParseStr;
  105. END

其执行结果如下:

利用SQL不仅需要写很复杂的函数,如果需要加入其他操作时,也需要花大量时间来修改。

如果采用程序处理此类问题那将简单的多,如下:

  1. using System.Text;
  2. using System.Web;
  3.  
  4. namespace UrlDecode
  5. {
  6. /*code 释迦苦僧*/
  7. public class UrlDll
  8. {
  9. /// <summary>
  10. /// 获取URL的值
  11. /// </summary>
  12. public static string GetUrlPara(string url, string key)
  13. {
  14. key = key + "=";
  15. string[] strs = url.Split('&');
  16. foreach (string str in strs)
  17. {
  18. if (str.IndexOf(key) >= )
  19. {
  20. string sub = str.Substring(str.IndexOf(key) + key.Length, str.Length - str.IndexOf(key) - key.Length);
  21. string sub2 = MyUrlDeCode(sub, null);
  22. if (sub2.IndexOf('?') >= )
  23. {
  24. sub2 = sub2.Substring(, sub2.IndexOf('?'));
  25. }
  26. return sub2;
  27. }
  28. }
  29. return string.Empty;
  30. }
  31. /// <summary>
  32. /// 解码URL.
  33. /// </summary>
  34. /// <param name="encoding">null为自动选择编码</param>
  35. /// <param name="str"></param>
  36. /// <returns></returns>
  37. public static string MyUrlDeCode(string str, Encoding encoding)
  38. {
  39. if (encoding == null)
  40. {
  41. Encoding utf8 = Encoding.UTF8;
  42. //首先用utf8进行解码
  43. string code = HttpUtility.UrlDecode(str, utf8);
  44. string tempcode = code;
  45. if (code.IndexOf('?') >= )
  46. {
  47. tempcode = code.Substring(, code.IndexOf('?'));
  48. }
  49. //将已经解码的字符再次进行编码.
  50. string encode = HttpUtility.UrlEncode(tempcode, utf8).ToUpper();
  51. if (encode.IndexOf('+') >= )
  52. {
  53. encode = encode.Substring(, encode.IndexOf('+'));
  54. }
  55. if (str.ToUpper().Contains(encode.ToUpper()))
  56. encoding = Encoding.UTF8;
  57. else
  58. encoding = Encoding.GetEncoding("gb2312");
  59. }
  60. string encodeing = HttpUtility.UrlDecode(str, encoding);
  61. if (encodeing.Contains("%") && encodeing.Length > )
  62. {
  63. return MyUrlDeCode2(encodeing, null);
  64. }
  65. return encodeing;
  66. }
  67. public static string MyUrlDeCode2(string str, Encoding encoding)
  68. {
  69. if (encoding == null)
  70. {
  71. Encoding utf8 = Encoding.UTF8;
  72. //首先用utf-8进行解码
  73. string code = HttpUtility.UrlDecode(str.ToUpper(), utf8);
  74. //将已经解码的字符再次进行编码.
  75. string encode = HttpUtility.UrlEncode(code, utf8).ToUpper();
  76. if (str.ToUpper() == encode)
  77. encoding = Encoding.UTF8;
  78. else
  79. encoding = Encoding.GetEncoding("gb2312");
  80. }
  81. return HttpUtility.UrlDecode(str, encoding);
  82. }
  83. }
  84. }

在SQL中调用此类的方法,需要将其封装在DLL中,如下:
1.将类库设置为.NET Framework2.0 如下:

2.在Release下编译成dll

3.将dll添加到SQL Server中

  1. --code 释迦苦僧
  2. --修改系统配置的存储过程当设置 show advanced options 参数为 1 时,才允许修改系统配置中的某些高级选相!!系统中这些高级选项默认是不允许修改
  3. exec sp_configure 'show advanced options',''
  4. go
  5. --重新配置 就是用来更新使用sp_configure 系统存储过程更改的配置选项的当前配置值
  6. reconfigure
  7. go
  8. --建立可信赖
  9. alter database Auth3 set trustworthy on
  10. go
  11. --添加关联DLL
  12. CREATE ASSEMBLY [System.Web] FROM 'C:\Windows\Microsoft.NET\Framework\v2.0.50727\System.Web.dll' WITH PERMISSION_SET = UNSAFE
  13. go
  14. --开启CLR集成
  15. EXEC sp_configure 'clr enabled',''
  16. go
  17. --重新配置 就是用来更新使用sp_configure 系统存储过程更改的配置选项的当前配置值
  18. reconfigure
  19. --添加刚刚编译的DLL
  20. create assembly SqlUrlDecode from 'D:\Test VS Project\UrlDll\UrlDecode\bin\Release\UrlDecode.dll'
  21. go
  22.  
  23. --创建函数
  24. CREATE FUNCTION dbo.FunUrlDecode
  25. (
  26. @url as nvarchar(500),
  27. @key as nvarchar(120)
  28. )
  29. RETURNS nvarchar(200)
  30. AS EXTERNAL NAME SqlUrlDecode.[UrlDecode.UrlDll].GetUrlPara
  31. --Sql命名空间 dll命名空间 dll dll方法

将dll添加成功后,我们可以在SQL SERVER 找到相关的Assembiles,如下:

其方法调用如下图:

如有问题欢迎指正

作者:释迦苦僧   出处:http://www.cnblogs.com/woxpp/p/3990277.html 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

Sql Server 调用DLL的更多相关文章

  1. 在SQL Server引用dll的流程

    原文:在SQL Server引用dll的流程 在SQL Server中引用dll分为两个步骤 1.创建一个dll文件 2.把dll文件放进SQL Server的程序集中.然后定义一个Function, ...

  2. ADO.NET访问SQL Server调用存储过程带回参

    1,ADO.NET访问SQL Server调用存储过程带回参 2,DatabaseDesign  use northwind go --存储过程1 --插入一条商品 productname=芹菜 un ...

  3. SQL Server 调用 C# 方法实现正则表达式验证

    Ø  前言 1.   在 SQL Server 中默认是不支持正则表达式验证的,如果需要某个字符串匹配一个正则表达式的验证规则,就需要额外的编写 C# 方法,并发布到 SQL Server 数据库中. ...

  4. sql server 调用webservice

    sql server版本2008以上,应该都可以 更改服务器配置 sp_configure ; GO RECONFIGURE; GO sp_configure ; GO RECONFIGURE; GO ...

  5. PHP 5.3.X 连接MS SQL Server php_mssql.dll

    在网上搜索了一下PHP 5.3.X 连接SQL Server的办法,有人也遇到了这个问题 原来PHP 团队在PHP 5.3 中移除了SQL Server的驱动和库,而微软自己开发了针对PHP的SQL驱 ...

  6. SQL SERVER调用textcopy写文件

    SET @PATH = 'textcopy /S ' + @LServer + ' /U '+ @LUser + ' /P '+ @LPass + ' /D '+ @LDB + ' /T '+@tab ...

  7. SQL Server ->> 调用系统内建扩展存储过程"master.dbo.xp_delete_file"删除过期备份文件

    DECLARE @oldDate DATETIME SET @oldDate = GETDATE()-30 EXECUTE MASTER.dbo.xp_delete_file 0, N'D:\back ...

  8. 在SQL Server中使用CLR调用.NET类库中的方法 (转载)

    在SQL Server中调用 .NET 类库的方法要分为下面几步来实现: 在.NET中新建一个类库项目,并在这个项目中添加一个类文件,并把要被SQL Server调用的方法定义为公有的,静态的方法. ...

  9. SQL Server内存理解的误区

    SQL Server内存理解 内存的读写速度要远远大于磁盘,对于数据库而言,会充分利用内存的这种优势,将数据尽可能多地从磁盘缓存到内存中,从而使数据库可以直接从内存中读写数据,减少对机械磁盘的IO请求 ...

随机推荐

  1. machine learning----->什么是机器学习

    1.概述: 学习一门学问的第一步就是要了解这门学问到底是什么,它可以被用来干什么. 本文罗列了学习machine learning的过程中看到的一些写得比较好的文章以及读完这些文章之后对机器学习的初步 ...

  2. 把svn上的mycelipse导到本地的eclipse中

    myeclipse和eclipse的web项目互导时会产生各种问题,现在把我遇到的情况记录如下: eclipse如何把svn上down下来的myeclipseWeb项目变成eclipse的Web项目: ...

  3. Ubuntu下配置和使用github

    一.配置github环境 1.环境:Ubuntu14.04 2.申请github账号 3.安装配置git服务器: (1)安装ssh:sudo apt-get install openssh-serve ...

  4. python之获取页面标签的方法

    from urllib.request import urlopen from urllib.error import HTTPError from bs4 import BeautifulSoup ...

  5. Python全栈之路8--迭代器(iter)和生成器(yield)

    一.生成器( iter ) 从Python2.2起,生成器提供了一种简洁的方式帮助返回列表元素的函数来完成简单和有效的代码. 它基于yield指令,允许停止函数并立即返回结果.此函数保存其执行上下文, ...

  6. SeleniumIDE初级入门

    Selenium  IDE:它是使用Javascript 脚本语言与CS端的DOM对象进行交互,并且为修改测试用例提供了接口.录制功能是它最大的亮点,录制功能可以让测试人员对需要进行测试的功能流程进行 ...

  7. MongoDB文档、集合、数据库简介

    文档 概述 文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行.在MongoDB中,文档表示为键值对的一个有序集.MongoDB使用Javascript shell,文档的表 ...

  8. -Dmaven.multiModuleProjectDirectory system property is not set. Check $M2_HOME environment variable

    在 myEclipse 中 需要配置 解决方法: window --> preferences --> java --> installed JREs 设置 Default VM A ...

  9. Windows服务的手动添加和删除方法

    Windows服务的手动添加和删除方法 服务,是指执行指定系统功能的程序.例程或进程,以便支持其他程序,尤其是低层(接近硬件)程序.其实,服务就是一种特殊的应用程序,它从服务启动开始就一直处于运行状态 ...

  10. cinder ha