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
是不允许的。
使用这个用户定义的函数,我收到错误消息“'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
是不允许的。