[Sql Server][原创]

[Sql Server][原创]自定义函数汇总 编辑


>> Sql表值函数

   01、获取指定表名的字段类型信息 > dbo.AH_GetTableColumnType(@TableName)

   02、将传入字符串拿分隔符分开后放到返回表里 > dbo.AH_CharDelimTable(@ParamStr,@DelimStr)

   03、返回字符串 @ParamStr 以 @Delim 字符分隔的元素中 (@MinMax = 1 : 最小数字 | @MinMax = 0 : 最大数字) > Erp.AH_StrMinMaxNumber(@MinMax,@ParamStr,@DelimStr) 

   04、 >

   05、 >

   06、 >

   07、 >

   08、 >

   09、 >

   10、 >

>> Sql标量值函数

   01、分隔符分隔字符串 > dbo.entry(@idx,@char_expr,@delim)

   02、 >

   03、 >

   04、 >

   05、 >

   06、 >

   07、 >

   08、 >

   09、 >

   10、 >


>> 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、目录

 
博客标明【原创】的文章都是本人亲自编写内容! 如有需要转载, 请标明出处:辉创1989(http://www.cnblogs.com/ahui1989/),届时非常感谢! 文章分享在此,希望我之原创有帮到你们! 如有不足之处也可联系我,以便我们共同探讨! 本人现职为Epicor10 系统 开发维护工作,如有需要可共同探讨相关技术知识及经验总结! QQ:929412592
原文地址:https://www.cnblogs.com/ahui1989/p/7649280.html