SQL常用自定义函数

去除字符串中连续的分割符

--创建函数

create function [dbo].[m_delrepeatsplit]

(

@str varchar(2000),

@split nvarchar(200)

)

returns nvarchar(2000)

as

begin

--begin declare

declare @count int,@i int,@isnull int

declare @newchar nvarchar(200),@nn nvarchar(300)

set @count=len(@str);set @i=1;set @isnull=1;set @nn=‘‘;

--end declare

--begin while

while @i<@count+1

begin

set @newchar=substring(@str,@i,1)

if(@isnull=1)

begin

set @[email protected][email protected];

if(@[email protected])

begin

set @isnull=0;

end

else

begin

set @isnull=1;

end

end

else

begin

if(@[email protected])

begin

set @isnull=0;

end

else

begin

set @[email protected][email protected];

set @isnull=1;

end

end

set @[email protected]+1;

end

--end while

return  @nn

end

--2、测试示例

declare @str nvarchar(200)

set @str=‘1  2 3    4 555 6  7    7‘;

declare @split nvarchar(200)

set @split=‘ ‘;

select dbo.m_delrepeatsplit(@str,@split) as newchar

--3、运行结果

/*

newchar

------------------

1 2 3 4 555 6 7 7

*/

求第一个字符串中第二个串的个数

--创建函数

create function [dbo].[m_count]

(

@str_one nvarchar(200),  --第一个字符串

@str_two nvarchar(200)   --第二个字符串

)

returns int as

begin

declare @sqlcount int

select @sqlcount=(len(@str_one)-len(replace(@str_one,@str_two,‘‘)))/len(@str_two)

return @sqlcount

end

--测试示例

select dbo.m_count(‘sqlserver‘,‘e‘) as [count]

--运行结果

/*

count

-----------

2

*/

综合模糊查询

--创建函数

create function [dbo].[m_fuzzyquery_v1]

(

@str nvarchar(2000)

)

returns nvarchar(2000)

as

begin

declare @count int,@i int;

declare @newchar nvarchar(200),@nn nvarchar(300),@hh nvarchar(200)

set @count=len(@str);set @i=1;set @nn=‘‘;

while @i<@count+1

begin

set @newchar=substring(@str,@i,1)+‘%‘

set @[email protected][email protected];

set @[email protected]+1;

end

set @hh=‘%‘[email protected]

return @hh

end

--测试数据

declare @table table (connect varchar(30))

insert into @table

select ‘我爱程序‘ union all

select ‘我的程序生活‘ union all

select ‘绝对无聊的生活‘ union all

select ‘活得好累‘ union all

select ‘程序员的生活‘ union all

select ‘序论‘ union all

select ‘生机‘ union all

select ‘生活杂志‘ union all

select ‘我只是随便写写‘ union all

select ‘真的是要来搜索的‘ union all

select ‘程序员一生的活路‘

--普通的模糊查询

select * from @table where connect like ‘%程序生活%‘

--运行结果

/*

connect

------------------------------

我的程序生活

*/

--应用函数查询

select * from @table where connect like ( select dbo.[m_fuzzyquery_v1](‘程序生活‘))

--运行结果

/*

connect

------------------------------

我的程序生活

程序员的生活

程序员一生的活路

*/

取出字符串中的汉字、字母或是数字

go

--创建函数(得到字符串中的汉字)

create function [dbo].[m_getchinese]

(

@chinese nvarchar(max)

)

returns varchar(100)

as

begin

while patindex(‘%[^吖-咗]%‘,@chinese) > 0

begin

set @chinese = stuff(@chinese,patindex(‘%[^吖-咗]%‘,@chinese),1,N‘‘);

end

return @chinese

end

go

--创建函数(得到字符串中的字母)

create function [dbo].[m_getstr](@maco varchar(100))

returns varchar(max)

as

begin

while patindex(‘%[^a-z]%‘,@maco) > 0

begin

set @maco=stuff(@maco,patindex(‘%[^a-z]%‘,@maco),1,‘‘)

end

return @maco

end

go

--创建函数(得到字符串中的数字)

create function [dbo].[m_getnumber]

(

@mysql_one nvarchar(200)

)

returns varchar(200)

begin

declare @mysql_two varchar(200)

select @mysql_two=

substring(@mysql_one,patindex(‘%[0-9.]%‘,@mysql_one),patindex(‘%[^0-9.]%‘,substring(@mysql_one,patindex(‘%[0-9.]%‘,@mysql_one),

len(@mysql_one)-patindex(‘%[0-9.]%‘,@mysql_one)+1))-1)

return @mysql_two;

end

--测试

select dbo.[m_getchinese](‘China2009中国HRB4-1v‘)

select dbo.[m_getstr](‘China2009中国HRB4-1v‘)

select dbo.[m_getnumber](‘China2009中国HRB4-1v‘)

--运行结果

/*

-----------

中国

-----------

ChinaHRBv

-----------

2009

*/

--说明一下

--上面这个取数字是可以取浮点型的

select dbo.[m_getnumber] (‘字段.456A(AA)A‘)--正常

select dbo.[m_getnumber] (‘CHinese2.1day‘)--正常

select dbo.[m_getnumber] (‘Name5.01From‘)--正常

select dbo.[m_getnumber] (‘9898Address‘)--正常

select dbo.[m_getnumber] (‘aaaaaForm2.3333‘)--错误

--修正函数

go

/* 取出字符串中间的数字(第二版)*/

create function [dbo].[m_getnumberV2.0]

(

@mysql_one nvarchar(200)

)

returns varchar(200)

begin

declare @mysql_two varchar(200)

declare @sql_one int

declare @sql_two int

select @sql_one= patindex(‘%[0-9.]%‘,@mysql_one)

select @sql_two=

patindex(‘%[^0-9.]%‘,

substring(@mysql_one,patindex(‘%[0-9.]%‘,@mysql_one),len(@mysql_one)-patindex(‘%[0-9.]%‘,@mysql_one)+1))

if @sql_two=0

begin

select @mysql_two= substring (@mysql_one,@sql_one,len(@mysql_one)[email protected]_one)

end

else

begin

select @mysql_two=substring (@mysql_one,@sql_one,@sql_two-1)

end

return @mysql_two;

end

--测试示例

select dbo.[m_getnumberV2.0] (‘字段.456A(AA)A‘)--正常

select dbo.[m_getnumberV2.0] (‘CHinese2.1day‘)--正常

select dbo.[m_getnumberV2.0] (‘Name5.01From‘)--正常

select dbo.[m_getnumberV2.0] (‘9898Address‘)--正常

select dbo.[m_getnumberV2.0] (‘aaaaaForm2.3333‘)--正常

根据字符分割字符串的三种写法

go

--创建函数(第一版)

create function [dbo].[m_split](@c varchar(2000),@split varchar(2))

returns @t table(col varchar(200))

as

begin

while(charindex(@split,@c)<>0)

begin

insert @t(col) values (substring(@c,1,charindex(@split,@c)-1))

set @c = stuff(@c,1,charindex(@split,@c),‘‘)

end

insert @t(col) values (@c)

return

end

--下面两种是在论坛看到高手们发的

go

--创建函数(第二版)(fredrickhu(小F))

create function [dbo].[f_split](@s varchar(8000), @split varchar(10) )

returns table

as

return

(select substring(@s,number,charindex(@split,@[email protected],number)-number)as col

from master..spt_values

where type=‘p‘ and number<=len(@s+‘a‘)

and charindex(@split,@[email protected],number)=number)

go

--创建函数(第三版)(dawugui(爱新觉罗.毓华))

create function [dbo].[d_split] (@inputstr varchar(8000),@seprator varchar(10))

returns @temp table (a varchar(200))

as

begin

declare @i int

set @inputstr = rtrim(ltrim(@inputstr))

set @i = charindex(@seprator, @inputstr)

while @i >= 1

begin

insert @temp values(left(@inputstr, @i - 1))

set @inputstr = substring(@inputstr, @i + 1, len(@inputstr) - @i)

set @i = charindex(@seprator, @inputstr)

end

if @inputstr <> ‘/‘

insert @temp values(@inputstr)

return

end

--测试示例

declare @sql varchar(20)

set @sql=‘A,B,C,D,E‘

select * from dbo.m_split(@sql,‘,‘)

select * from dbo.f_split(@sql,‘,‘)

select * from dbo.d_split(@sql,‘,‘)

--运行结果(结果是相同的)

/*

col

---------

A

B

C

D

E

*/

根据身份证得到生日函数

go

--创建函数(函数来自csdn,作者不详)

create function [dbo].[Get_birthday]

(

@idcardno nvarchar(50)

)

returns varchar(10)

as

begin

declare @birthday datetime

if (len(@idcardno)=15 or len(@idcardno)=16) and substring(@idcardno,9,2) between 1 and 12   andsubstring(@idcardno,11,2) between 1 and 31

set @birthday= convert(varchar(10),‘19‘+substring(@idcardno,7,2)+‘-‘+substring(@idcardno,9,2)+‘-‘+substring(@idcardno,11,2),120)

else if len(@idcardno)=18 and substring(@idcardno,7,2)>=19 and substring(@idcardno,11,2) between 1 and 12   andsubstring(@idcardno,13,2) between 1 and 31

set @birthday= convert(varchar(10),substring(@idcardno,7,4)+‘-‘+substring(@idcardno,11,2)+‘-‘+substring(@idcardno,13,2),120)

else

set @birthday=null

return(convert(varchar(10),@birthday,120))

end

--测试示例

select dbo.[Get_birthday](‘222222198306043213‘)

--运行结果

/*

1983-06-04

*/

根据身份证计算性别函数

Go

--创建函数(函数来自csdn,作者不详)

create function [dbo].[Get_sex]

(

@idcardno nvarchar(50)

)

returns int

as

begin

declare @sex int

if (len(@idcardno)=18 and isnumeric(substring(@idcardno,17,1))=1 )

set @sex= (case when substring(@idcardno,17,1)  in(1,3,5,7,9) then 1

when substring(@idcardno,17,1)  in(2,4,6,7,0)  then 2 else 0 end)

else if (len(@idcardno)=15 and isnumeric(substring(@idcardno,15,1))=1 )

set @sex= (case when substring(@idcardno,15,1)  in(1,3,5,7,9) then 1

when substring(@idcardno,15,1)  in(2,4,6,7,0)  then 2 else 0 end)

else

set @sex=0

return(@sex)

end

--测试示例

select dbo.[Get_sex](‘222222198306043213‘)

--运行结果(1表示男0表示女)

/*

1

*/

将身份证的15位号码升级为18位

go

--创建函数(此函数来自于csdn,作者不详)

create function [dbo].[id15to18] (@id15 char(15))

returns char(18)

as

begin

declare @id18 char(18)

declare @s1 as integer

declare @s2 as integer

declare @s3 as integer

declare @s4 as integer

declare @s5 as integer

declare @s6 as integer

declare @s7 as integer

declare @s8 as integer

declare @s9 as integer

declare @s10 as integer

declare @s11 as integer

declare @s12 as integer

declare @s13 as integer

declare @s14 as integer

declare @s15 as integer

declare @s16 as integer

declare @s17 as integer

declare @s18 as integer

set @s1=substring(@id15,1,1)

set @s2=substring(@id15,2,1)

set @s3=substring(@id15,3,1)

set @s4=substring(@id15,4,1)

set @s5=substring(@id15,5,1)

set @s6=substring(@id15,6,1)

set @s7=1

set @s8=9

set @s9=substring(@id15,7,1)

set @s10=substring(@id15,8,1)

set @s11=substring(@id15,9,1)

set @s12=substring(@id15,10,1)

set @s13=substring(@id15,11,1)

set @s14=substring(@id15,12,1)

set @s15=substring(@id15,13,1)

set @s16=substring(@id15,14,1)

set @s17=substring(@id15,15,1)

set @s18=((@s1*7)+(@s2*9)+(@s3*10)+(@s4*5)+(@s5*8)+(@s6*4)+(@s7*2)+(@s8*1)

+(@s9*6)+(@s10*3)+(@s11*7)+(@s12*9)+(@s13*10)+(@s14*5)+(@s15*8)+(@s16

*4)+(@s17*2))%11

set @id18=substring(@id15,1,6)+‘19‘+substring(@id15,7,9)

+case when @s18=0 then ‘1‘

when @s18=1 then ‘0‘

when @s18=2 then ‘x‘

when @s18=3 then ‘9‘

when @s18=4 then ‘8‘

when @s18=5 then ‘7‘

when @s18=6 then ‘6‘

when @s18=7 then ‘5‘

when @s18=8 then ‘4‘

when @s18=9 then ‘3‘

when @s18=10 then ‘2‘

end

return @id18

end

--测试示例

select [dbo].[id15to18](‘222222830604321‘)

--运行结果

/*

222222198306043213

*/

通过身份证获得户籍

go

--创建函数(此函数来自于csdn,作者不详)

create function [dbo].[f_getcityfromcid] (@cid varchar(18))

returns varchar(50)

as

begin

declare @acity varchar(1000)

set @acity = ‘____,____,____,____,____,____,____,____,____,____,____,北京__,天津__,河北__,山西__,内蒙古_,____,____,____,____,____,辽宁__,吉林__,黑龙江_,____,____,____,____,____,____,____,上海__,江苏__,浙江__,安微__,福建__,江西__,山东__,____,____,____,河南__,湖北__,湖南__,广东__,广西__,海南__,____,____,____,重庆__,四川__,贵州__,云南__,西藏__,____,____,____,____,____,____,陕西__,甘肃__,青海__,宁夏__,新疆__,____,____,____,____,____,台湾__,____,____,____,____,____,____,____,____,____,香港__,澳门__,____,____,____,____,____,____,____,____,国外__,‘

select @acity=replace(@acity,‘ ‘,‘‘);

set @cid = upper(@cid)

if (len(@cid) <> 18 or patindex(‘%[^0-9x]%‘,@cid) > 0)

return ‘这不是合法的身份证‘

if substring(@acity,cast(left(@cid,2) as int)* 5+1,4) = ‘‘

return ‘这身份证的地区码不存在‘

return ‘您的户籍是:‘+replace(substring(@acity,cast(left(@cid,2) as int)* 5+1,4),‘_‘,‘‘)

end

--测试示例

select dbo.[f_getcityfromcid](‘222222198306043213‘)

--运行结果

/*

您的户籍是:吉林

*/

多个数据项的字符串取指定位置字符

2011-03-19 19:27 1108人阅读 评论(0) 收藏 举报

nullfunctiondate测试

-- Author:  happyflsytone

-- Date:2008-11-05 14:59:34

-- 创建函数

create function [dbo].[split_str]

(

@s varchar(8000),      --包含多个数据项的字符串

@index int,            --要获取的数据项的位置

@split varchar(10)     --数据分隔符

)

returns varchar(100)

as

begin

if @s is null return(null)

begin

declare @splitlen int

select @splitlen=len(@split+‘A‘)-2

end

while @index>1 and charindex(@split,@[email protected])>0

begin

select @[email protected],@s=stuff(@s,1,charindex(@split,@[email protected])[email protected],‘‘)

end

return(isnull(left(@s,charindex(@split,@[email protected])-1),‘‘))

end

--测试示例

select dbo.split_str(‘1-2-3-4‘,3,‘-‘)

--运行结果

/*

3

*/

人民币小写金额转大写

--1、人民币小写金额转大写(第一版)

====================================================================

-- Title: 人民币小写金额转大写

-- Author: dobear        Mail(MSN): [email protected]

-- Environment: Vista + SQL2005

-- Date: 2008-06-12

-- Remark: dobear原创,转载请注明出处,有问题请发Mail告之

-- ====================================================================

go

--创建函数

create function [dbo].[fn_getformatmoney] (@money numeric(14,2))

returns nvarchar(32) as

begin

declare @money_num nvarchar(20)    --存储金额的字符形式

, @money_chn nvarchar(32)    --存储金额的中文大写形式

, @n_chn nvarchar(1), @i int    --临时变量

select @money_chn=case when @money>=0 then ‘‘ else ‘(负)‘ end

, @money=abs(@money)

, @money_num=stuff(str(@money, 15, 2), 13, 1, ‘‘)    --加前置空格补齐到位(去掉小数点)

, @i=patindex(‘%[1-9]%‘, @money_num)    --找到金额最高位

while @i>=1 and @i<=14

begin

set @n_chn=substring(@money_num, @i, 1)

if @n_chn<>‘0‘ or (substring(@money_num,@i+1,1)<>‘0‘ and @i not in(4, 8, 12, 14))    --转换阿拉伯数字为中文大写形式

set @[email protected]_chn+substring(‘零壹贰叁肆伍陆柒捌玖‘, @n_chn+1, 1)

if @n_chn<>‘0‘ or @i in(4, 8, 12)    --添加中文单位

set @[email protected]_chn+substring(‘仟佰拾亿仟佰拾万仟佰拾圆角分‘,@i,1)

set @[email protected]+1

end

set @money_chn=replace(@money_chn, ‘亿万‘, ‘亿‘)    --当金额为x亿零万时去掉万

if @money=0 set @money_chn=‘零圆整‘    --当金额为零时返回‘零圆整‘

if @n_chn=‘0‘ set @[email protected]_chn+‘整‘    --当金额末尾为零分时以‘整‘结尾

return @money_chn    --返回大写金额

end

go

--测试示例

select dbo.fn_getformatmoney(4545.44)

--运行结果

/*

肆仟伍佰肆拾伍圆肆角肆分

*/

--2、人民币小写金额转大写(第二版)

/*编写者:(博客天地www.inbaidu.com )

创建时间:

功能:小写金额转换成大写

参数:@LowerMoney 小写金额加上小数点最长可以保留位

输出:大写金额

简介:SQL版小写金额转换成大写金额(最多可以精确到小数点四位)

注: Decimal 数据类型最多可存储个数字

转载:请保留以上信息,谢谢!!!

********************************************************/

go

--创建函数

create function [dbo].[lowertoupper](@lowermoney decimal(38,4))

returns varchar(200)    --返回的大写金额的字符

as

begin

declare @lowerstr  varchar(50)    --小写金额

declare @upperstr  varchar(200)  --大写金额

declare @uppertmp  varchar(15)    --大写金额的临时字符串

declare @i          int            --递增量

declare @lowerlen  int            --小写金额的总长度

set @lowerstr = @lowermoney --把decimal型的值全部赋给字符串变量注:(赋值过去的话如在字符串变量中是显示.0000 因为小数位精确到四位,没有的话,它会自动补)

set @lowerstr = replace(@lowerstr,‘.‘,‘‘) --把小数点替换成空字符    --精确到小数点的四位角分厘毫

set @lowerlen = len(@lowerstr) --获取小写金额的总长度(包括四个小数位)

select @i = 1,@upperstr = ‘‘,@uppertmp = ‘‘ --设置默认初始值

while @i <= @lowerlen

begin

set @uppertmp = case

when substring(@lowerstr,@lowerlen - @i + 1,1) = ‘0‘ and @i = 5 and(convert(int,right(@lowerstr,4)) = 0 or @lowerlen > 5) then ‘元‘      --注:如果个位为的话,并且四位小数都是或者它的长度超过(也就是超过元),则为元

--when substring(@lowerstr,@lowerlen - @i + 1,1) = ‘0‘ then ‘‘

else

+ case substring(@lowerstr,@lowerlen - @i + 1,1) --看当前位是数字几,就直接替换成汉字繁体大写

when ‘0‘ then ‘零‘

when ‘1‘ then ‘壹‘

when ‘2‘ then ‘贰‘

when ‘3‘ then ‘叁‘

when ‘4‘ then ‘肆‘

when ‘5‘ then ‘伍‘

when ‘6‘ then ‘陆‘

when ‘7‘ then ‘柒‘

when ‘8‘ then ‘捌‘

when ‘9‘ then ‘玖‘

end

+ case @i

when 1      then ‘毫‘

when 2      then ‘厘‘

when 3      then ‘分‘

when 4      then ‘角‘

when 5      then ‘元‘

when 9      then ‘萬‘

when 13      then ‘亿‘

when 17      then ‘兆‘

when 21      then ‘京‘

when 25      then ‘垓‘

when 29      then ‘杼‘

when 33      then ‘穰‘

when 37      then ‘沟‘ --decimal型最大长度是后面的就不用再考虑了

else

+ case @i%4

when 2 then ‘拾‘      --拾10 14 18 22 26 30 34 38 …………

when 3 then ‘佰‘      --佰11 15 19 23 27 31 35 39 …………

when 0 then ‘仟‘      --仟12 16 20 24 28 32 36 40 …………

end

end

end

set @upperstr = isnull(@uppertmp,‘‘) + isnull(@upperstr,‘‘)

set @i = @i + 1

end

if convert(int,right(@lowerstr,4)) = 0 set @upperstr = left(@upperstr,len(@upperstr)-8) + ‘整‘ --判断小数位数是不是都是,是就可以取整

while patindex(‘%零[仟佰拾角分厘毫零]%‘,@upperstr) <> 0    --把零拾或零佰或零零变成一个零

begin

set @upperstr = stuff(@upperstr,patindex(‘%零[仟佰拾角分厘毫零]%‘,@upperstr),2,‘零‘)

end

while patindex(‘%[沟穰杼垓京兆亿萬]零[沟穰杼垓京兆亿萬]%‘,@upperstr) <> 0 --把零萬或零亿的清空掉

begin

select @upperstr = stuff(@upperstr,patindex(‘%[沟穰杼垓京兆亿萬]零[沟穰杼垓京兆亿萬]%‘,@upperstr)+1,2,‘‘)

end

while patindex(‘%[仟佰拾]零[沟穰杼垓京兆亿萬]%‘,@upperstr) <> 0 --把类似拾零萬或佰零萬或仟零萬中间的零清空掉

begin

select @upperstr = stuff(@upperstr,patindex(‘%[仟佰拾]零[沟穰杼垓京兆亿萬]%‘,@upperstr)+1,1,‘‘)

end

if patindex(‘%_零[元]%‘,@upperstr) <> 0 --把类似拾零元或百零元中间的零清空掉

begin

select @upperstr = stuff(@upperstr,patindex(‘%_零[元]%‘,@upperstr) + 1,1,‘‘)

end

else if (patindex(‘零[元]%‘,@upperstr) <> 0) and (convert(int,right(@lowerstr,4)) <> 0) --判断当前否是零元开头,并且后面的四个小数不为

begin

select @upperstr = stuff(@upperstr,patindex(‘零[元]%‘,@upperstr),2,‘‘) --把零元清空掉

end

if right(@upperstr,1) = ‘零‘ set @upperstr = left(@upperstr,len(@upperstr)-1)      --如果最后一位是零也清空掉

if @upperstr = ‘元整‘ set @upperstr = ‘零‘ + @upperstr                            --如果只是的话,就显示零元整

return @upperstr      --返回大写金额

end

--测试示例

Select dbo.LowerToUpper(120000000) --壹亿贰仟萬元整

Select dbo.LowerToUpper(102000000) --壹亿零贰佰萬元整

Select dbo.LowerToUpper(100200000) --壹亿零贰拾萬元整

Select dbo.LowerToUpper(100020000) --壹亿零贰萬元整

Select dbo.LowerToUpper(100002000) --壹亿贰仟元整

--运行结果

/*

壹亿贰仟萬元整

壹亿零贰佰萬元整

壹亿零贰拾萬元整

壹亿零贰萬元整

壹亿贰仟元整

*/

检查给定串是否存在于由区间及点集的结合内

分类: SQL函数分享系列2011-03-20 01:19 1048人阅读 评论(0) 收藏 举报

insertfunctiontabledate测试

------------------------------------

-- Author: happyflystone

-- Date:2009-07-20

-- Parameter: @CardString

-- 被查询的串,形如:-13300001234,13300002230,13300002300

-- @CardNo  要查询的串

-- Return : int 0 -- 不存在于搜索串的范围内

--              1 -- 存在于

-- 转载请注明出处。更多请访问:http://blog.csdn.net/happyflystone

-- 原帖地址:http://blog.csdn.net/happyflystone/archive/2009/07/21/4365264.aspx

------------------------------------

--创建函数

Create function IsInCardString(@CardString varchar(8000),@CardNo varchar(11))

returns int

as

begin

declare @temp table(a varchar(200))

declare @i int

set @CardString = rtrim(ltrim(@CardString))+‘,‘

set @i = charindex(‘,‘, @CardString)

while @i >= 1

begin

insert @temp values(left(@CardString, @i - 1))

set @CardString = substring(@CardString, @i + 1, len(@CardString) - @i)

set @i = charindex(‘,‘, @CardString)

end

if exists(select 1

from (

select case when charindex(‘-‘,a) > 0 then left(a,11) else a end as s,

case when charindex(‘-‘,a) > 0 then right(a,11) else a end as e

from @temp

) a

where @CardNo between s and e)

set @i= 1

else

set @i= 0

return @i

end

go

--测试示例

declare @CardString varchar(1000)

set @CardString =‘13300000000-13300001234,13300002230,13300002300,13300002302,13300004101-13300004204,13300004212,13300004310‘

declare @CardNo varchar(1000)

set @CardNo = ‘13300000001‘  --存在

select dbo.IsInCardString(@CardString,@CardNo) as result1

set @CardNo = ‘13300001235‘  --不存在

select dbo.IsInCardString(@CardString,@CardNo) as result2

--运行结果

/*

result1

-----------

1

01、去除字符串中的html标记及标记中的内容

02、去除字符串中连续的分割符

03、求第一个字符串中第二个串的个数

04、综合模糊查询

05、将十进制转成十六进制

06、求两个字符串中相同的汉字及字母的个数

07、生成n位随机字符串

08、取出字符串中的汉字、字母或是数字

09、根据字符分割字符串的三种写法

10、将数字转换千分位分隔形式

11、取汉字首字母的两个函数

12、根据身份证得到生日函数

13、根据身份证计算性别函数

14、将身份证的15位号码升级为18位

15、通过身份证获得户籍

16、多个数据项的字符串取指定位置字符

17、中缀算术转后缀算术表达式并计算的函数

18、人民币小写金额转大写

19、向左填充指定字符串

20、将整型数字转换为大写汉字

21、检查给定串是否存在于由区间及点集的结合内

22、根据日期返回星座

23、计算两个日期之间的工作日

24、根据年月生成日历函数

25、从第一个汉字开始分割字符串

26、过滤掉字符串中重复的字符

27、根据日期得到星期的函数

28、根据年度判断是否是闰年

29、完善SQL农历转换函数

30、SQL简繁转换函数

31、自定义函数实现位操作

32、求某段时间内星期几的天数

33、根据进舍位或四舍五入来求值

34、字符串转成16进制函数

35、去掉字段中多个带区号电话号码前面的区号

36、SQL2000/2005字符串拆分为列表通用函数

37、求字符串中汉字的个数

38、得到条形码的校验位函数

39、根据年月得到当月的天数

40、将一个正整数分解为m个2的n次方的和

41、SQL位移运算函数

42、得到汉字笔画函数

43、SQL数字转英文函数

44、全角半角转换函数

45、返回两个时间范围内的一个随机时间

46、获取元素个数的函数

47、获取指定索引的值的函数

48、根据年得到所有星期日的日期

49、生成两个时间之间的所有日期

50、无序字符比较函数

51、在SQL SERVER中实现RSA加解密函数(第一版)

52、在SQL SERVER中实现RSA加解密函数(第二版)

53、输出指定格式的数据列

54、汉字转拼音函数

55、数字转IP地址函数

56、对字符串进行加密解密

57、计算个人所得税函数

result2

-----------

0

*/

go

--创建函数(第一版)

create function get_orderstr(@str varchar(8000))

returns varchar(8000)

as

begin

set @str=rtrim(@str)

declare @tb table(s varchar(1),a int)

while len(@str)>0

begin

insert into @tb select left(@str,1),ascii(left(@str,1))

set @str=right(@str,len(@str)-1)

end

declare @sql varchar(8000)

select @sql=isnull(@sql+‘‘,‘‘)+s from @tb order by a

return isnull(@sql,‘‘)

end

--测试示例

if(dbo.get_orderstr(‘abc‘)=dbo.get_orderstr(‘acb‘))

print ‘相同‘

else

print ‘不同‘

--运行结果

/*

相同

*/

--第二版

/*

* 功能:不按先后顺序比较字符串序列是否相同       *

* 适用:SQL Server 2000 / SQL Server 2005         *

* 返回:相同不相同                               *

* 作者:Flystone                                  *

* 描述:学习Limpire(昨夜小楼)的方法后做一个动态SQL的*

*/

go

--创建存储过程(这个不是函数)

CREATE proc sp_CompareString

@Str1 varchar(100),

@Str2 varchar(100),

@Split varchar(10),

@ret int output

AS

BEGIN

declare @Len int, @Sub varchar(100)

if @Str1 = @Str2 return(1)

if len(@Str1) <> len(@Str2) or len(replace(@Str1, @Split, ‘‘)) <> len(replace(@Str2, @Split, ‘‘))

begin

set @ret = 0

return

end

set @str1 = ‘select ‘‘‘+replace(@str1,@Split,‘‘‘ as col union all select ‘‘‘)+‘‘‘‘

set @str2 = ‘select ‘‘‘+replace(@str2,@Split,‘‘‘ as col union all select ‘‘‘)+‘‘‘‘

declare @s nvarchar(4000)

set @s = ‘

if exists(select 1 from (‘[email protected]+‘) a where not exists(select 1 from (‘[email protected]+‘) b where a.col  = b.col)

or

exists(select 1 from (‘[email protected]+‘) a where not exists(select 1 from (‘[email protected]+‘) b where a.col  = b.col)

))

select @ret = 0

else

select @ret = 1‘

exec sp_executesql @s,N‘@ret int output‘,@ret output

END

GO

--测试示例

declare @ret int

exec sp_CompareString ‘a,b,c‘, ‘b,c,a‘, ‘,‘,@ret out

select @ret

exec sp_CompareString ‘a,b,c‘, ‘b,c,c,a‘, ‘,‘,@ret out

select @ret

drop proc sp_CompareString

go

--第三版

/* * * * * * * * * * * * * * * * * * * * * * *

* 功能:不按先后顺序比较字符串序列是否相同*

* 适用:SQL Server 2000 / SQL Server 2005   *

* 返回:相同不相同                      *

* 作者:Limpire(昨夜小楼)                   *

* * * * * * * * * * * * * * * * * * * * * * */

--创建函数

CREATE FUNCTION fn_CompareString

(

@Str1 varchar(100),

@Str2 varchar(100),

@Split varchar(10)

)

RETURNS bit

AS

BEGIN

declare @Len int, @Sub varchar(100)

if @Str1 = @Str2 return(1)

if len(@Str1) <> len(@Str2) or len(replace(@Str1, @Split, ‘‘)) <> len(replace(@Str2, @Split, ‘‘)) return(0)

select @Len = len(@Split), @Str1 = @Split + @Str1 + @Split, @Str2 = @Split + @Str2 + @Split

while charindex(@Split, @Str1, @Len + 1) > 0

begin

set @Sub = left(@Str1, charindex(@Split, @Str1, @Len + 1) + @Len - 1)

if charindex(@Sub, @Str2) = 0 return(0)

while charindex(@Sub, @Str1) > 0 set @Str1 = replace(@Str1, @Sub, ‘,‘)

while charindex(@Sub, @Str2) > 0 set @Str2 = replace(@Str2, @Sub, ‘,‘)

if len(@Str1)<>len(@Str2) return(0)

end

return(1)

END

GO

--测试示例

select dbo.fn_CompareString(‘a,b,c‘, ‘b,c,a‘, ‘,‘)

select dbo.fn_CompareString(‘a,b,c‘, ‘b,c,c,a‘, ‘,‘)

--运行结果

/*

1

0

*/

时间: 2024-08-15 08:30:26

SQL常用自定义函数的相关文章

13、SQL Server 自定义函数

SQL Server 自定义函数 在SQL Server中不仅可以使用系统函数(如:聚合函数,字符串函数,时间日期函数等)还可以根据需要自定义函数. 自定义函数分为标量值函数和表值函数. 其中,标量值函数用于返回单个值,而表值函数用于返回一个结果集. 函数参数 参数可以是常量.表中的某个列.表达式或其他类型的值.在函数中有三种类型的参数. 1.输入:指必须输入一个值. 2.可选值:在执行该参数时,可以选择不输入参数. 3.默认值:函数中默认有值存在,调用时可以不指定该值. 创建标量值函数 语法:

SQL Server -- 自定义函数(学习总结,备忘)

SQL Server自定义函数,以前只在书上看过,没有动手去敲一敲,今天刚好接触到,看了几篇博文学习了下.做好备忘很重要!! (@[email protected])Y Learn from:http://www.cnblogs.com/lideng/archive/2013/04/15/3022418.html 自定义函数分为:标量值函数或表值函数两种. 标量值函数:如果 RETURNS 子句指定一种标量数据类型,则函数为标量值函数. 表值函数:如果 RETURNS 子句指定 TABLE,则函

也来谈谈SQL SERVER 自定义函数~

在使用SQL SERVER 数据库的时候,函数大家都应该用过,简单的比如 系统聚合函数 Sum(),Max() 等等.但是一些初学者编写自定义函数的时候,经常问起什么是表值函数,什么是标量值函数. 表值函数,顾名思义函数的返回值当然是返回一个表了.就是 TABLE 类型.TABLE 类型就相当于一张存储在内存中的一张虚拟表. 表值函数有分为内联表值函数(相当于参数化的视图)和多语句表值函数,二者原理一样,功能略有不同当然写法也就略有不同. 多语句表值函数 语法模板: CREATE FUNCTIO

SQL Server 自定义函数(Function)——参数默认值

原文:SQL Server 自定义函数(Function)--参数默认值 sql server 自定义函数分为三种类型:标量函数(Scalar Function).内嵌表值函数(Inline Function).多声明表值函数(Multi-Statement Function) 标量函数:标量函数是对单一值操作,返回单一值. 内嵌表值函数:内嵌表值函数的功能相当于一个参数化的视图.它返回的是一个表,内联表值型函数没有由BEGIN-END 语句括起来的函数体. 多声明表值函数:它的返回值是一个表,

sql常用格式化函数及字符串函数

一.常用格式化函数 1.日期转字符串 select to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS') //2017-09-18 22:41:50 YYYY:年(4和更多位) MM:月份号(01-12) DD:一个月里的日(01-31) HH24:一天的小时数(00-23) MI:分钟(00-59) SS:秒(00-59) 2.字符串转日期 select to_date('2017-09-18','YYYY-MM-DD') //2017-09-

Microsoft SQL Server 自定义函数整理大全

01.去除字符串中的html标记及标记中的内容 [叶子函数分享一]去除字符串中的html标记及标记中的内容 --1.创建函数 create function [dbo].[clearhtml] (@maco varchar(8000)) returns varchar(8000) as begin     declare @i int     while 1 = 1     begin        set @i=len(@maco)        set @maco=replace(@maco

Microsoft SQL Server 自定义函数整理大全(下)

34.字符串转成16进制函数 /**************************** 字符串转成16进制 作者:不得闲 QQ: 75492895 Email: [email protected] ****************************/ --创建函数(suiyunonghen(不得闲)) Create Function VarCharToHex(@Str Varchar(400)) returns varchar(800) as begin declare @i int,@

mysql 常用自定义函数解析

-- /* -- * 用于获取一记录数据,根据传入的分隔字符delim,索引位置pos,返回相对应的value -- * SELECT Json_getKeyValue({"A":"2","B":"0","C":"1","D":"1"},'A'); -- */ DELIMITER $$ DROP FUNCTION IF EXISTS `Json_g

Expression 转化为sql(三) --自定义函数

SQL 语句有很多函数如len(),now()等等.如何来生成这些函数.最近研究也写办法共大家参考. 一.首先建立一个建一个扩展类,控制只能允许这些函数出现,如果出现其他函数就直接报异常. 1 public static class SQLMethods 2 { 3 public static bool DB_In<T>(this T t, List<T> list) // in 4 { 5 return true; 6 } 7 public static Boolean DB_N