Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 表值函数中的公共表表达式(CTE)_Sql Server_Common Table Expression - Fatal编程技术网

Sql server 表值函数中的公共表表达式(CTE)

Sql server 表值函数中的公共表表达式(CTE),sql-server,common-table-expression,Sql Server,Common Table Expression,我习惯于在MSSQL 2008 R2中使用常见的表表达式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

我习惯于在MSSQL 2008 R2中使用常见的表表达式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_测试更详细一点。例如,在函数体中声明一个变量。首先,我需要有显式的begin和end,因为函数体将不再是单个语句。因此,我尝试创建这样一个:

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比单个返回语句更复杂,如何在表值函数中使用它?

如果向内联表值函数添加多条语句,它将不再是内联表值函数。它将成为一个多语句表值函数。因此,这场演出将惨败。这些函数通常比标量函数更糟糕。顺便说一句,你不需要像那样把报税表用括号括起来。谢谢你的提示。在这种特殊情况下,函数不会嵌入到任何较大的查询中,而是直接调用,并将结果直接插入到另一个表中。因此,我并不关心优化器是否可以通过内联来“看穿”函数定义。不过,我还是会留意经济放缓的情况。
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