zoukankan      html  css  js  c++  java
  • SQL Server用户自定义函数

    分为表值函数(返回Table类型的表数据)和标量值函数(返回某个数据类型的某个值)

    标量值函数语法:【内可省略】

    create function 【[dbo].】函数名(【参数……】)

    returns 数据类型

    as

    begin

    return 要返回的值

    end

    示例:

    --返回分隔字符串左面部分
    CREATE FUNCTION [dbo].[fn_leftFirst]   
    (  
        @source nvarchar(max), @split nvarchar(1000) 
    )  
    RETURNS nvarchar(max)  
    AS  
    BEGIN  
      if(CHARINDEX(@split, @source)>0)BEGIN
            return left(@source,CHARINDEX(@split, @source)-LEN(@split)+1)
        END
        return @source
    END

    调用:

    select [dbo].fn_leftFirst('123456789','34');

    返回:12。注意上述[dbo].不能省略。否则会报'fn_leftFirst' 不是可以识别的 函数名称。

    (多语句)表值函数语法1:

    create function 【[dbo].】函数名(【参数……】)

    returns @table TABLE(列名1 列名1类型,……)

    as

    begin

    insert into @table values(值1,……);

    returns @table

    end

    示例:

    --分隔字符串
    CREATE FUNCTION [dbo].[f_splitSTR](  
        @s   varchar(8000),   --待分拆的字符串  
        @split varchar(10)     --数据分隔符  
    )RETURNS @re TABLE(  
            col varchar(max))  
    AS  
    BEGIN  
        DECLARE   
            @splitlen int  
      
        -- 取分隔符的长度, 在分隔符后面加一个字符是为了避免分隔符以空格结束时, 取不到正确的长度  
        SET @splitlen = LEN(@split + 'a') - 2  
        -- 如果待分拆的字符串中存在数据分隔符, 则循环取出每个数据项  
        WHILE CHARINDEX(@split, @s)>0  
        BEGIN  
            -- 取第一个数据分隔符前的数据项  
            INSERT @re VALUES(LEFT(@s, CHARINDEX(@split, @s) - 1))  
              
            -- 将已经取出的第一个数据项和数据分隔符从待分拆的字符串中去掉  
            SET @s = STUFF(@s, 1, CHARINDEX(@split, @s) + @splitlen, '')  
        END  
          
        -- 保存最后一个数据项(最后一个数据项后面没有数据分隔符, 故在前面的循环中不会被处理)  
        INSERT @re VALUES(@s)  
        RETURN     
      end  

    (内联)表值函数语法2:

    create function 【[dbo].】函数名(【参数……】)

    returns TABLE(列名1 列名1类型,……)

    as

    begin

    return(select **** )

    end

     示例:

    CREATE FUNCTION [GetMoreThanSalary]
    (    
        @salary int
    )
    RETURNS TABLE 
    AS
    RETURN 
    (
        SELECT [FName],[FCity],[FAge],[FSalary] FROM [Demo].[dbo].[T_Person] Where [FSalary] > @salary
    )
    GO
  • 相关阅读:
    Java基础技术多线程与并发面试【笔记】
    Java GC【笔记】
    Java JVM【笔记】
    Java基础技术JVM面试【笔记】
    Java HashSet和TreeSet【笔记】
    Java TreeMap 和 LinkedHashMap【笔记】
    Java HashMap【笔记】
    Java LinkedList【笔记】
    Java ArrayList【笔记】
    java基础技术集合面试【笔记】
  • 原文地址:https://www.cnblogs.com/yanan7890/p/9275284.html
Copyright © 2011-2022 走看看