2014-06-12 50 views
2

當我嘗試在SQL Server 2008中保存視圖時,出現「關鍵字'OPTION''附近有錯誤的語法」錯誤。我正在嘗試將MAXRECURSION選項添加到我的共同表格表達。我之前創建的所有示例以及正在運行的CTE都不介意CTE末尾的「OPTION(MAXRECURSION 0)」。在CTE聲明中關鍵字'OPTION'附近的語法不正確

任何人都明白爲什麼我會收到此錯誤?儘管CTE達到了遞歸的最大數量(100),但CTE沒有使用OPTION子句。

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); 

回答

0

您不能在視圖中應用此選項。您需要將其應用於調用視圖的查詢。例如

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); 

如果你認爲一個觀點更是超過存儲查詢的存儲子查詢的(是的,它可以在它自己的調用,但它不一定是),並記住它的定義擴大了到主查詢(除非你使用NOEXPLAND - 你不能對包含遞歸CTE反正視圖),所以在本質上,你正在嘗試做這樣的事情:

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) 
+0

感謝您的深思熟慮的解釋和示例,但我仍然無法將其應用於我的情況。 我把我的CTE作爲一個單獨的視圖保存(我們稱之爲「V」,如你的例子)。然後我創建了另一個視圖,如下所示: 'SELECT * FROM V OPTION(MAXRECURSION 0);' 但是,當我去保存新視圖時仍存在同樣的問題:「關鍵字選項附近的語法錯誤」。我認爲這是你的榜樣。我究竟做錯了什麼? – user3585730

+0

我還注意到,如果將MAXRECURSION選項添加到存儲過程中的CTE定義的末尾,則可接受該選項。它不會在視圖內被接受。雖然它在存儲過程中被接受,但它對遞歸的最大數量沒有任何影響。奇怪的。 – user3585730

+0

「*然後我創建了另一個視圖,如下所示:'SELECT * FROM V OPTION(MAXRECURSION 0);'但仍然是同樣的問題」* - 這是否令人驚訝?無論您嵌套視圖多少次,都無法將查詢提示應用於該視圖。它本身並不是一個完整的查詢,因此不能有提示。 – GarethD

相關問題