Sql服务器用户自定义函数BEGIN语句掉出错误

Sql server user defined function BEGIN sentence drops out error

使用这个用户定义的函数,我收到错误消息“'BEGIN' 附近的语法不正确”。如果我退出 BEGIN,则警告消失。为什么在这种情况下我不能使用 BEGIN?

ALTER FUNCTION dbo.fnMyFunc
(
@MyType int
)
RETURNS TABLE
AS
BEGIN
RETURN SELECT tbl.[UID] FROM 
(
SELECT [UP].[UID], [UP].[ADDITIONAL_IDENTIFIER], MAX(VALID_FROM) [VALID_FROM]
FROM [CM].[USER_PROPS] [UP]
GROUP BY [UP].[UID], [UP].[ADDITIONAL_IDENTIFIER]
HAVING [UP].[ADDITIONAL_IDENTIFIER] = @MyType
) tbl
END

一个内联 table 值函数只能有一个语句。 BEGIN...END 语法根本没有在这里定义。永远不需要它,因为无论如何您不能使用多个语句。

此限制的原因是 SQL 服务器需要能够将函数体内联到其调用查询中。如果只有一个 SELECT 语句而没有其他语句,这可以通过一种高效而简单的方式实现。

对于 Inline Table-Valued Function,这是 MS SQL 语法。

CREATE FUNCTION <Inline_Function_Name, sysname, FunctionName> 
(   
    -- Add the parameters for the function here
    <@param1, sysname, @p1> <Data_Type_For_Param1, , int>, 
    <@param2, sysname, @p2> <Data_Type_For_Param2, , char>
)
RETURNS TABLE 
AS
RETURN 
(
    -- Add the SELECT statement with parameter references here
    SELECT 0
)
GO

对于 Multi-statement Table-Valued Function,这是 MS SQL 语法。

CREATE FUNCTION <Table_Function_Name, sysname, FunctionName> 
(
    -- Add the parameters for the function here
    <@param1, sysname, @p1> <data_type_for_param1, , int>, 
    <@param2, sysname, @p2> <data_type_for_param2, , char>
)
RETURNS 
<@Table_Variable_Name, sysname, @Table_Var> TABLE 
(
    -- Add the column definitions for the TABLE variable here
    <Column_1, sysname, c1> <Data_Type_For_Column1, , int>, 
    <Column_2, sysname, c2> <Data_Type_For_Column2, , int>
)
AS
BEGIN
    -- Fill the table variable with the rows for your result set

    RETURN 
END
GO

在您的情况下,您使用的是 Inline Table-Valued Function,因此 Begin 是不允许的。