分为表值函数(返回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