table 值函数中的常见 table 表达式 (CTE)

Common table expression (CTE) in table-valued function

我习惯于在 MSSQL 2008 R2 中使用常见的 table 表达式 (CTE)。我知道关于它们可以出现在哪里的语法有点繁琐,并且在普通的 T-SQL 中,在 with 表达式之前需要一个明确的分号(或开始一个新的批次)。我想在用户定义的函数中使用 CTE。对于简单的情况,这有效:

create function dbo.udf_test()
returns table
with schemabinding
as
return (
  with foo as (
    select 5 as f
  )
  select f
  from foo
)

但现在我想让我的函数 udf_test 更详细一些。例如在函数体内声明一个变量。首先,我需要明确 beginend 因为函数体将不再是单个语句。所以我尝试这样创建一个:

create function dbo.udf_test()
returns table
with schemabinding
as
begin
  return (
    with foo as (
      select 5 as f
    )
    select f
    from foo
  )
end

然而这给出了错误

Incorrect syntax near the keyword 'with'.

如果 CTE 比单个 return 语句更复杂,我如何在我的 table 值函数中使用它?

CREATE FUNCTION dbo.udf_test()
RETURNS 
@return TABLE 
(
    f int NOT NULL
)
AS
BEGIN

    WITH foo AS (
        SELECT 5 AS f
    )
    INSERT INTO @return
    SELECT f
    FROM foo;

    RETURN;
END