sql - CTE 语句中关键字 'OPTION' 附近的语法不正确

标签 sql sql-server-2008 common-table-expression

尝试在 SQL Server 2008 中保存 View 时出现“关键字'OPTION'附近的语法不正确”错误。我正在尝试将 MAXRECURSION 选项添加到公用表表达式的末尾。我见过的所有示例和我之前创建的工作 CTE 都不介意 CTE 末尾的“选项(MAXRECURSION 0)”。

有人知道我为什么会收到此错误吗? CTE 在没有 OPTION 子句的情况下工作,尽管它达到了最大递归数 (100)。

WITH CTE AS
(
  SELECT
    CDay,
    InvAcct,
    BuyerCode,
    PartNumber,
    ROP,
    ROP_ROQ,
    DailyDemand,
    StartingInvQty,
    SchedDeliveryQty,
    CAST(StartingInvQty - DailyDemand/2.0 AS decimal(18,4)) AS ProjInvQty
  FROM
    qryInventorySimulation
  WHERE
    MBC = 'B' AND
    CDay = CAST(CAST(GETDATE()AS date) as datetime)

  UNION ALL

  SELECT
    qryInventorySimulation.CDay,
    qryInventorySimulation.InvAcct,
    qryInventorySimulation.BuyerCode,
    qryInventorySimulation.PartNumber,
    qryInventorySimulation.ROP,
    qryInventorySimulation.ROP_ROQ,
    qryInventorySimulation.DailyDemand,
    qryInventorySimulation.StartingInvQty,
    qryInventorySimulation.SchedDeliveryQty,
    CAST(CTE.ProjInvQty + qryInventorySimulation.SchedDeliveryQty - qryInventorySimulation.DailyDemand AS decimal(18,4)) AS ProjInvQty
  FROM
    qryInventorySimulation INNER JOIN CTE ON qryInventorySimulation.InvAcct = CTE.InvAcct AND qryInventorySimulation.PartNumber = CTE.PartNumber AND qryInventorySimulation.CDay = DATEADD(d,1,CTE.CDay)
  WHERE
    qryInventorySimulation.CDay <= DATEADD(d,120,GETDATE())
)

SELECT * FROM CTE
OPTION (MAXRECURSION 0);

最佳答案

您无法在 View 中应用此选项。您需要将其应用于调用 View 的查询。例如

CREATE VIEW dbo.V
AS
    WITH CTE AS
    (   SELECT 1 AS A 
        UNION ALL
        SELECT A + 1
        FROM    CTE
        WHERE   A < 50
    )
    SELECT  *
    FROM    CTE;
GO
SELECT  *
FROM    dbo.V
OPTION (MAXRECURSION 0);

如果您认为 View 更像是存储子查询而不是存储查询(是的,它可以自己调用,但不一定),请记住它的定义扩展到主查询中(除非您使用 NOEXPLAND -无论如何,您无法在包含递归 CTE 的 View 上执行此操作),因此本质上您正在尝试执行以下操作:
WITH RecursiveCTE AS (...)
SELECT *
FROM T
    INNER JOIN 
    (   SELECT  *
        FROM    RecursiveCTE
        OPTION (MAXRECURSION 0)
    ) c
        ON c.SomeField = T.SomeField;

而正确的语法是:
WITH RecursiveCTE AS (...)
SELECT *
FROM T
    INNER JOIN 
    (   SELECT  *
        FROM    RecursiveCTE
    ) c
        ON c.SomeField = T.SomeField;
OPTION (MAXRECURSION 0)

关于sql - CTE 语句中关键字 'OPTION' 附近的语法不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188350/

相关文章:

sql - 检查 Postgresql 中条件的约束

mysql - 当绑定(bind)参数为空时,视为 "select all"

从 SQL Server 中的另一个 SProc 调用一个 SProc 的性能影响

mysql 编译器。使用 with 并插入它会提示语法错误

sql - 作为 PostgreSQL 中比较运算符的结果返回整数值

sql - 如何在 SQL 和关系代数中无论列顺序如何只列出每对元组一次?

c# - 将大插入作为表值参数或作为字符串插入语句传递给 SQL Server 更好吗?

SQL Server : flatten results from One to Many query

postgresql - 窗口函数和更多 "local"聚合

sql - CTE 从源表构建层次结构