打赏

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

 

posted @ 2018-07-06 19:33  每天都要学一点  阅读(723)  评论(0编辑  收藏  举报