2014-06-12 1 views
2

SQL Server 2008에서보기를 저장하려고하면 "OPTION '키워드 근처에"구문이 잘못되었습니다. "라는 오류 메시지가 나타납니다. 끝에 MAXRECURSION 옵션을 추가하려고합니다. 내 공통 테이블 식. 이전에 작성한 CTE를 본 모든 사례는 CTE의 끝에서 "OPTION (MAXRECURSION 0)"에 신경 쓰지 않습니다.CTE 문에서 키워드 'OPTION'근처에 잘못된 구문이 있음

누구나 왜이 오류가 발생하는지 알 수 있습니까? 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); 

답변

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);' 새 뷰를 저장하려고해도 "키워드 OPTION 근처에서 구문이 잘못되었습니다"라는 동일한 문제가 있습니다. 나는 이것이 당신의 본을 따른다고 생각했습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까? – user3585730

+0

또한 저장 프로 시저 내에서 CTE 정의의 끝에 추가하면 MAXRECURSION 옵션이 허용된다는 사실을 확인했습니다. 그것은 전망 안에서 받아 들여지지 않을 것입니다. 저장 프로 시저 내에서 받아 들여지더라도 최대 재귀 횟수에는 영향을주지 않습니다. 기묘한. – user3585730

+0

"* 다음과 같이 다른 뷰를 만들었습니다 : SELECT * FROM V OPTION (MAXRECURSION 0);하지만 여전히 같은 문제"* - 이것은 놀랍습니까? 조회 힌트를 적용 할 수없는보기를 몇 번이나 중첩했는지는 중요하지 않습니다. 그 자체로 전체 쿼리가 아니기 때문에 힌트를 가질 수 없습니다. – GarethD