打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
SQL Server 2005中开发通用的自定义函数,实现类似Min或MAX函数功能(附源码)

 SQL Server 2005中通用的自定义函数,实现类似Min或MAX函数功能

开发一个通用的自定义函数,适用每个表,而不是某一个具体的表专用,类似SQL Server 2005的Min或MAX函数功能。

源码下载 

主要实现:
1、在sql语句中直接可以取出值来。从select 的from 子句中传递表名,参数中传递要判断的字段名,即类似于select max(myid) from mytable 。这样处理就不用对每一个表都写一个函数(里面直接封装表的名称)。
2、因为我想做一个通用的ID流水号生成器,而不是专用于某一个表而实现。所以我想到了max和min这两个东东。通常使用 insert into 来追加记录。想通过以下这种方式追加记录: Insert into mytable (id,other_cols) select getnextid(id),'值' from mytable 。

注意:由于存储过程必须执行一行命令,所以不能满足要求。

源程序:

[c-sharp] view plaincopy
  1. using System;  
  2. using System.Text;  
  3. using System.Data;  
  4. using System.Data.SqlTypes;  
  5. using Microsoft.SqlServer;  
  6. using Microsoft.SqlServer.Server;  
  7.   
  8. namespace TestFunction  
  9. {  
  10.     [Serializable()]  
  11.     [SqlUserDefinedAggregate(Format.UserDefined,  
  12.         IsInvariantToNulls=true,  
  13.         IsNullIfEmpty=true,  
  14.         MaxByteSize=8000  
  15.         )  
  16.     ]  
  17.     public class CLRMax:IBinarySerialize  
  18.     {  
  19.         string currentValue = string.Empty;  
  20.           
  21.         public void Read(System.IO.BinaryReader r)  
  22.         {  
  23.             currentValue = r.ReadString();  
  24.         }  
  25.   
  26.         public void Write(System.IO.BinaryWriter w)  
  27.         {  
  28.             w.Write(currentValue);  
  29.         }  
  30.         //Nothing to do  
  31.         public void Init()  
  32.         {  
  33.   
  34.         }  
  35.         public void Accumulate(SqlString value)  
  36.         {  
  37.             if (value.IsNull)  
  38.                 return;  
  39.             if (value.Value.CompareTo(currentValue)>0)  
  40.                 currentValue = value.Value;  
  41.         }  
  42.         public void Merge(CLRMax other)  
  43.         {  
  44.             if (this.currentValue.CompareTo(other.currentValue) > 0)  
  45.                 this.currentValue = other.currentValue;  
  46.         }  
  47.         public SqlString Terminate()  
  48.         {  
  49.             return new SqlString(currentValue);  
  50.         }  
  51.      }  
  52. }  

编译成Dll後,就可以在sql中使用了。ex:
编译成CLRMax.dll,放至c:/中。
然後在sql中执行下述语句创建aggregate的function

[c-sharp] view plaincopy
  1. CREATE ASSEMBLY ClrMax FROM 'C:/ClrMax.dll'  
  2. GO  
  3. CREATE AGGREGATE ClrMax(@Input NVARCHAR(200)) RETURNS NVARCHAR(MAX)  
  4. EXTERNAL NAME [ClrMax].[TestFunction.CLRMax]  
  5. GO  


开启CLR ENABLED.

[c-sharp] view plaincopy
  1. exec sp_configure 'show advanced options''1';  
  2. go  
  3. reconfigure;  
  4. go  
  5. exec sp_configure 'clr enabled''1'  
  6. go  
  7. reconfigure;  
  8. exec sp_configure 'show advanced options''1';  
  9. go   

--使用测试.

[c-sharp] view plaincopy
  1. CREATE TABLE ta (a int,b varchar(10))  
  2. GO  
  3. CREATE TABLE tb (col1 nvarchar(10),col2 decimal(13,4),col3 datetime,col4 bit)  
  4. GO  
  5. INSERT INTO ta   
  6. SELECT 1,'aa'  
  7. UNION ALL  
  8. SELECT 2,'aa'  
  9. UNION ALL  
  10. SELECT 3,'aa'  
  11. UNION ALL  
  12. SELECT 4,'aa'  
  13. UNION ALL  
  14. SELECT 10,'bbbbb'  
  15. UNION ALL  
  16. SELECT 10,'BBBBB'  
  17. UNION ALL  
  18. SELECT 15,'bbbbZ'  
  19.   
  20. INSERT INTO tb  
  21. SELECT 'a',28.4,GETDATE(),0  
  22. UNION ALL  
  23. SELECT 'b',29.4,GETDATE(),NULL  
  24. UNION ALL  
  25. SELECT 'c',30.4,DATEADD(DAY,10,GETDATE()),0  
  26. GO  
  27.   
  28.   
  29. SELECT  b, dbo.ClrMax(a) FROM ta GROUP BY b   
  30. /* 
  31. aa    4 
  32. bbbbb    10 
  33. bbbbZ    15 
  34. */  
  35.   
  36. SELECT dbo.ClrMax(col1),  
  37.        dbo.ClrMax(col2),  
  38.        dbo.ClrMax(col3),  
  39.        dbo.ClrMax(col4)  
  40. FROM    tb  
  41. /* 
  42. c    30.4000    03 20 2009  9:41PM    0 
  43. */      

感谢CSDN的Garnett_KG朋友提供源码,受益匪浅。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Visual C#中动态操作SQL Server数据库
SQL Server 2005 的nvarchar(max),令我抓狂的问题解决了!
通用分页存储过程(SQL Server 2005)
【重上五线金不换】通用选股公式源码
SQL取得最大排序数字并累加1的自定义函数
MySql自定义函数-关于保留小数位的特殊需求
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服