将CTE SELECT更改为用户定义的表值函数

Cha*_*adD 1 t-sql sql-server-2008

之前的文章中,我构建了一个在SO贡献者的帮助下使用CTE的SQL.我现在想将SQL封装在一个用户定义的函数中,该函数返回一个表,但我收到的错误如下.

这是代码:

Alter FUNCTION GetDescendentSteps 
(   
@StepId INT 
)
RETURNS TABLE 
AS
RETURN
    ;WITH cteRecursion
         AS (SELECT
                 StepId
                 ,1 AS Level
             FROM
                 Step
             WHERE
                 StepId = @StepId
             UNION ALL
             SELECT
                 t.StepId
                 ,c.Level + 1
             FROM
                 Step t
                 INNER JOIN cteRecursion c
                     ON t.ParentStepId = c.StepId
            )
    SELECT
        StepId,Level
    FROM
        cteRecursion
    ORDER BY
        Level,
        StepId;
Run Code Online (Sandbox Code Playgroud)

我收到错误:

Msg 102, Level 15, State 1, Procedure GetDescendentSteps, Line 8
Incorrect syntax near ';'.
Run Code Online (Sandbox Code Playgroud)

注意第8行是:

;WITH cteRecursion
Run Code Online (Sandbox Code Playgroud)

..如果我只执行从第8行开始的SQL(在我用文字替换变量@StepId之后).

此外,这个简单的例子有效:

ALTER FUNCTION GetDescendentSteps 
(   
@StepId INT 
)

RETURNS TABLE 

AS
RETURN
select 7 As Stepid,1 As Level
Run Code Online (Sandbox Code Playgroud)

Mik*_*son 6

删除第一个;order by子句.

Alter FUNCTION GetDescendentSteps 
(   
@StepId INT 
)
RETURNS TABLE 
AS
RETURN
    WITH cteRecursion
         AS (SELECT
                 StepId
                 ,1 AS Level
             FROM
                 Step
             WHERE
                 StepId = @StepId
             UNION ALL
             SELECT
                 t.StepId
                 ,c.Level + 1
             FROM
                 Step t
                 INNER JOIN cteRecursion c
                     ON t.ParentStepId = c.StepId
            )
    SELECT
        StepId,Level
    FROM
        cteRecursion
Run Code Online (Sandbox Code Playgroud)