多语句表UDF能像内联UDF一样在FROM子句中被引用,但是和内联UDF不同的是,它们不限制在函数定义内只能使用·一个SELECT语句。多语句UDF能在UDF定义的主体内使用多个T-SQL语句以定
义最后要返回的一个结果集。
多语句表UDF的基本语法如下:
CREATE FUNCTION [ schema_name. ] function_name
( [ { @parameter_name [ AS ] [ type_schema_name. ] parameter_data_type
[ = default ] [READONLY] }
[ ,...n ]
]
)
RETURNS @return_variable TABLE <table_type_definition>
[ WITH <function_option> [ ,...n ] ]
[ AS ]
BEGIN
function_body
RETURN
END
多语句UDF参数
参 数 | 描 述 |
[ schema_name. ] function_name | 这个参数指定了可选的架构名和必需的新内联UDF的函数名 |
@parameter_name | 要传给UDF的参数名,必须以@符号作为前缀 |
type_schema_name. ] parameter_data_type | @parameter_name的数据类型和可选的拥有者架构(使用用户定义类型作为参数的时候用) |
[ ,...n ] | 尽管不是实际的参数,这个语法元素表示能定义一个或多个参数(最多1024个) |
@return_variable | 用户定义的表变量名,它保存了UDF返回的结果 |
<table_type_definition> | 这个参数包台了表变量一个或多个列的定义.每个列的定义包含了名字和数据类型,并且可以有选择地定义PRIMARY KEY、UNIQUE、NULL或CHECK约束 |
function_body | 这个函数体包含了用于填充和修改UDF返回的表变量的一个或多个T-SQL语句 |
注意RETURNS关键字,它定义了表变量(table variable)的定义。同样地,注意函数最后的RETURN关键字,没有任何参数或查询在它之后,这样会返回定义的表变量。
示例:创建的多语句UDF,接受两个参数:一个用来保存字符串,而另外一个定义字符串如何被分隔。字符串然后根据定义的分隔符分割成一个结果集:
USE AdventureWorks
GO
--创建一个把字符数组作为结果集返回UDF
CREATE FUNCTION dbo.udf_ParseArray
(@StringArray varchar(max),@Delimiter char(1))
RETURNS @StringArrayTable Table (val varchar(50))
AS
BEGIN
DECLARE @Delimiter_position int
IF RIGHT(@StringArray,1) !=@Delimiter
SET @StringArray=@StringArray + @Delimiter
WHILE CHARINDEX(@Delimiter,@StringArray)<>0
BEGIN
SELECT @Delimiter_position=CHARINDEX(@Delimiter,@StringArray)
INSERT @StringArrayTable
VALUES (left(@StringArray,@Delimiter_position-1))
SELECT @StringArray=STUFF(@StringArray,1,@Delimiter_Position,'')
END
RETURN
END
现在,用它来分割一个以逗号分隔的数组值:
SELECT Val
FROM dbo.udf_ParseArray('A,B,C,D,E,F,G',',')
LEFT函数和分隔符位置配合来把独立的分隔后的部分字符串放到表变量中
STUFF用于删除一组字符并用另外的字符串替代。STUFF函数的第一个参数是字符表达式。第二个参数是要删除和插入文本的起始位置,在这里要移除的文本是从字符串的起始位置开始到第一个分隔符结束。第三个参数是要删除的字符长度,在本例中就是分隔符位置变量的值。最后一个参数是要插入的字符串,在这里是用两个单引号表示的空字符串一一效果就像是第一个条目被删除了那样。