[Sql Server][原创] - Microsoft SQL Server 自定义函数汇总 - 辉创1989
[Sql Server][原创]自定义函数汇总 编辑
01、获取指定表名的字段类型信息 > dbo.AH_GetTableColumnType(@TableName)
02、将传入字符串拿分隔符分开后放到返回表里 > dbo.AH_CharDelimTable(@ParamStr,@DelimStr)
03、返回字符串 @ParamStr 以 @Delim 字符分隔的元素中 (@MinMax = 1 : 最小数字 | @MinMax = 0 : 最大数字) > Erp.AH_StrMinMaxNumber(@MinMax,@ParamStr,@DelimStr)
01、分隔符分隔字符串 > dbo.entry(@idx,@char_expr,@delim)
>> Sql表值函数 目录
01、获取指定表名的字段类型信息 > dbo.AH_GetTableColumnType(@TableName) 目录
/* 函数: dbo.AH_GetTableColumnType(@TableName) 作用: 获取指定表 @TableName 的字段类型信息到返回表内 测试: select * from dbo.AH_GetTableColumnType('KH_H_ProcExecLog') 结果: 序号 表名 字段名 类型编码 字段类型 字段类型描述 字段长度 精度 小数位 1 KH_H_ProcExecLog [ProcName] 231 nvarchar nvarchar(100) 200 100 NULL 2 KH_H_ProcExecLog [ExecUser] 231 nvarchar nvarchar(100) 200 100 NULL 3 KH_H_ProcExecLog [ExecDate] 61 datetime datetime 8 23 3 4 KH_H_ProcExecLog [Conditions] 231 nvarchar nvarchar(max) -1 -1 NULL 5 KH_H_ProcExecLog [LogRandomID] 56 int int 4 10 0 6 KH_H_ProcExecLog [UserTime] 56 int int 4 10 0 作者: 辉创1989 邮箱:929412592@qq.com QQ: 929412592 */ ALTER Function [dbo].[AH_GetTableColumnType] ( @TableName nvarchar(500) ) Returns @ColumnTypeTable Table ( [序号] decimal(18, 0) identity(1,1) primary key, [表名] nvarchar(50), [字段名] nvarchar(50), [类型编码] int, [字段类型] nvarchar(50), [字段类型描述] nvarchar(50), [字段长度] int, [精度] int, [小数位] int ) As begin insert into @ColumnTypeTable( [表名], [字段名], [类型编码], [字段长度], [精度], [小数位] ) select A.name 表名, '[' + B.name + ']' 字段名, B.xtype 类型编码, B.length 字段长度, B.prec 精度, B.scale 小数位 from [dbo].[sysobjects] A,[dbo].[syscolumns] B where A.id = B.id and A.xtype = 'U'and A.name = @TableName update @ColumnTypeTable set [字段类型] = B.Name from @ColumnTypeTable A,[dbo].[systypes] B where A.[类型编码] = B.xtype update @ColumnTypeTable set [字段类型描述] = [字段类型] where [字段类型] in ('bit','int','date','datetime','timestamp','uniqueidentifier') update @ColumnTypeTable set [字段类型描述] = Replace([字段类型] + '(' + cast( [精度] as nvarchar(5)) + ')','-1','max') where [字段类型] in ('nvarchar','nchar') update @ColumnTypeTable set [字段类型描述] = [字段类型] + '(' + cast( [精度] as nvarchar(5)) + ',' + cast( [小数位] as nvarchar(5)) + ')' where [字段类型] = 'decimal' return end
02、将传入字符串拿分隔符分开后放到返回表里 > dbo.AH_CharDelimTable(@ParamStr,@DelimStr) 目录
/* 函数: dbo.AH_CharDelimTable(@ParamStr,@DelimStr) 作用: 将传入字符串拿分隔符分开后放到返回表里 测试: select * from dbo.AH_CharDelimTable('A,B,,C,D,D',',') 结果: ParamID ParamValue 1 A 2 B 3 4 C 5 D 6 E 作者: 辉创1989 邮箱:929412592@qq.com QQ: 929412592 */ ALTER Function [dbo].[AH_CharDelimTable] ( @ParamStr nvarchar(max), @DelimStr nvarchar(20) ) Returns @CharDelimTable Table ( ParamID decimal(18, 0) IDENTITY(1,1) primary key, ParamValue nvarchar(max) NULL ) As begin if(Len(@ParamStr) = 0) return else begin if(CharIndex(@DelimStr,@ParamStr) = 0) begin insert into @CharDelimTable(ParamValue) select @ParamStr as ParamValue end else begin while(CharIndex(@DelimStr,@ParamStr) > 0) begin insert into @CharDelimTable(ParamValue) select SubString(@ParamStr,0,CharIndex(@DelimStr,@ParamStr)) as ParamValue set @ParamStr = SubString(@ParamStr,CharIndex(@DelimStr,@ParamStr)+1,Len(@ParamStr)) end insert into @CharDelimTable(ParamValue) select @ParamStr as ParamValue end end return end
03、返回字符串 @ParamStr 以 @Delim 字符分隔的元素中 (@MinMax = 1 : 最小数字 | @MinMax = 0 : 最大数字) > Erp.AH_StrMinMaxNumber(@MinMax,@ParamStr,@DelimStr) 目录
/* 函数: Erp.AH_StrMinMaxNumber(@MinMax,@ParamStr,@DelimStr) 作用: 返回字符串 @ParamStr 以 @Delim 字符分隔的元素中 (@MinMax = 1 : 最小数字 | @MinMax = 0 : 最大数字) 测试: select Erp.AH_StrMinMaxNumber(1,'0,-9,1,-89,42,u',',') as MinNumber -- 结果:最小值 -89 select Erp.AH_StrMinMaxNumber(0,'0,-9,1,89,452,t',',') as MaxNumber -- 结果:最大值 452 select Erp.AH_StrMinMaxNumber(0,'0mm','m') as MaxNumber -- 结果:最大值 0 返回: Null 表示传入字符串拿分隔符分开后无数字,否则返回字符串中对应最大或最小数字 调用: Erp.AH_CharDelimTable(@ParamStr,@DelimStr) 表值函数 :将传入字符串 @ParamStr 拿分隔符 @DelimStr 分开后放到返回表里 作者: 辉创1989 邮箱:929412592@qq.com QQ: 929412592 */ Alter function [Erp].[StrMinMaxNumber] ( @MinMax bit, @ParamStr nvarchar(max), @DelimStr nvarchar(1) ) returns int as begin declare @Return int = 0 if(@MinMax = 1) set @Return = (select Min(Cast(ParamValue as int)) from Erp.CharDelimTable(@ParamStr,@DelimStr) where IsNumeric(ParamValue) = 1) else set @Return = (select Max(Cast(ParamValue as int)) from Erp.CharDelimTable(@ParamStr,@DelimStr) where IsNumeric(ParamValue) = 1) return(@Return) end
04、目录
05、目录
06、目录
07、目录
08、目录
09、目录
10、目录
>> Sql标量值函数 目录
01、分隔符分隔字符串 > dbo.entry(@idx,@char_expr,@delim) 目录
/* 函数: dbo.entry(@idx,@char_expr,@delim) 作用: 获取指定字符串 @char_expr 依据分隔符 @delim 分隔后字符列表第 @idx 字符 测试: select * from dbo.select dbo.entry(1,'AC-E300PW-702C','-') 结果:AC select * from dbo.select dbo.entry(2,'AC-E300PW-702C','-') 结果:E300PW select * from dbo.select dbo.entry(3,'AC-E300PW-702C','-') 结果:702C 作者: 辉创1989 邮箱:929412592@qq.com QQ: 929412592 */ Alter Function [dbo].[entry](@idx int, @char_expr nvarchar(max), @delim nchar(1)) returns nvarchar(1000) as begin declare @begin int,@end int,@count int declare @str nvarchar(max) set @count = 1 set @begin = 1 set @end = charindex(@delim, @char_expr) if @idx <= 0 return (NULL) if (@end = 0) and @idx > 1 return (NULL) if (@end = 0) and @idx = 1 return @char_expr set @str = @char_expr while charindex(@delim, @str) > 0 and @count < @idx begin set @begin = charindex(@delim, @str) + 1 set @str = substring(@str, @begin, len(@str) - @begin + 1) set @count = @count + 1 end if @count < @idx return (NULL) if charindex(@delim, @str) > 0 set @str = substring(@str, 1, charindex(@delim, @str) - 1) else set @str = substring(@str, 1, len(@str)) return (@str) end
02、目录
03、目录
04、目录
05、目录
06、目录
07、目录
08、目录
09、目录
10、目录