2016-12-16 408 views
2

我有一个查询返回的错误超过了递归的最大级别。SQL Server:语句完成之前最大递归100已用尽

我知道如何通过将OPTION (maxrecursion 0)添加到查询来解决此问题,但是,我试图在查询中的各个位置添加此项,并且无法找到将语法放在何处的位置。

任何人都可以给我任何指针,以我在哪里查看提示需要插入?

/****** Object: View [dbo].[SiconCFMContractLinesDetailByDayView] Script Date: 16/12/2016 12:02:35 ******/ 
SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

CREATE VIEW [dbo].[SiconCFMContractLinesDetailByDayView] 
AS 
WITH dateRange as 
(
SELECT  [Date] = DATEADD(dd, 1, DATEADD(dd, -1,[SiconCFMContractLinesOutstandingView].[NextDueDate])), 
[Frequency] = [SiconCFMContractLinesOutstandingView].[FrequencyValue], 
[EndDate] = DATEADD(yy,5, [SiconCFMContractLinesOutstandingView].[NextDueDate]), 
[SiconCFMContractLinesOutstandingView].[SiconContractLineID] 
FROM  [SiconCFMContractLinesOutstandingView] 
WHERE  DATEADD(mm, [SiconCFMContractLinesOutstandingView].[FrequencyValue], [SiconCFMContractLinesOutstandingView].[NextDueDate]) < DATEADD(mm, [SiconCFMContractLinesOutstandingView].[FrequencyValue], DATEADD(yy,5, [SiconCFMContractLinesOutstandingView].[NextDueDate])) 
UNION ALL 
SELECT  DATEADD(mm, [Frequency], [Date]) [Date], 
[Frequency], 
[EndDate], 
[SiconContractLineID] 
FROM  dateRange 
WHERE  DATEADD(mm, [Frequency], [Date]) < DATEADD(mm, [Frequency],[EndDate]) 

) 

SELECT 
(
SELECT CASE 
WHEN dbo.fnSiconCFMGetSettingValue('UseAverageTimeToPay') = 'True' 
THEN 
CASE [SiconCFMSLCustomerAverageTimeToPayView].[AvgTimeToPayDateLastUpdated] 
WHEN NULL THEN dbo.fnSiconCFMDateByPaymentTerms([SLCustomerAccount].[SYSPaymentTermsBasisID], [SLCustomerAccount].[PaymentTermsInDays], dateRange.[Date]) 
ELSE DATEADD([DD],[SiconCFMSLCustomerAverageTimeToPayView].[Days],dateRange.[Date]) 
END 
ELSE dbo.fnSiconCFMDateByPaymentTerms([SLCustomerAccount].[SYSPaymentTermsBasisID], [SLCustomerAccount].[PaymentTermsInDays], dateRange.[Date]) 
END 
) 
AS [DueDate], 
[StockItem].[Name] AS [Title], 
[SiconCFMContractLinesOutstandingView].[Description] AS [Description], 
[SiconCFMContractLinesOutstandingView].[UnitBillCoverPriceIncDisc] AS [Value], 
[SiconCFMContractLinesOutstandingView].[SiconContractID], 
[SiconCFMContractLinesOutstandingView].[SiconContractLineID], 
[SiconCFMContractLinesOutstandingView].[SiconContractLineID] AS [ForecastDateForeignID], 
'SiconContractLine' AS [ForecastDateSource], 
(
SELECT 
CASE WHEN EXISTS 
(
SELECT [SiconCFMMemo].[SiconCFMMemoID] 
FROM [SiconCFMMemo] 
WHERE [SiconCFMMemo].[Deleted]=0 
AND [SiconCFMMemo].[IsActive]=1 
AND [SiconCFMMemo].[MemoSource]='SiconContractLine' 
AND [SiconCFMMemo].[MemoForeignID]=[SiconCFMContractLinesOutstandingView].[SiconContractLineID] 
) 
THEN 1 
ELSE 0 
END 
) AS [HasMemos] 
FROM   dateRange 
INNER JOIN  [SiconCFMContractLinesOutstandingView] 
ON    dateRange.[SiconContractLineID] 
=    [SiconCFMContractLinesOutstandingView].[siconContractLineID] 
INNER JOIN  [StockItem] 
ON    [StockItem].[ItemID] 
=    [SiconCFMContractLinesOutstandingView].[ItemID] 
INNER JOIN  [SLCustomerAccount] 
ON    [SLCustomerAccount].[SLCustomerAccountID] 
=    [SiconCFMContractLinesOutstandingView].[SLCustomerAccountID] 
INNER JOIN  [SiconCFMSLCustomerAverageTimeToPayView] 
ON    [SiconCFMSLCustomerAverageTimeToPayView].[SLCustomerAccountID] 
=    [SLCustomerAccount].[SLCustomerAccountID] 
GO 

的建议我已经加入OPTION(MAXRECURSION 0)略高于最后GO语句,但是当创建视图语句内它是给一个语法错误。如果我自己运行查询,它在创建视图语句之外运行

+3

在使用该recurcive CTE –

回答

5

通常,在使用recurcive cte的select语句的末尾。
但是,在一个视图内,将无法正常工作。 快速搜索让我到this post - 这解释了正确的做法。

原来你不能在视图中使用查询提示,但你可以也应该在调用视图的查询中使用它。

样品表:

CREATE TABLE T 
(
    id int, 
    parent int 
) 
INSERT INTO T VALUES (1, NULL), (2, 1), (3, 1), (4, 2), (5, 2), (6, 3), (7, 4), (8, 5); 
GO 

创建视图:

CREATE VIEW V 
AS 

WITH CTE AS 
(
    SELECT id, parent 
    FROM T 
    WHERE parent IS NULL 
    UNION ALL 

    SELECT t.id, t.parent 
    FROM T 
    INNER JOIN CTE ON t.parent = cte.id 
) 

SELECT * 
FROM CTE 

GO 

执行视图:

SELECT * 
FROM V 
OPTION (MAXRECURSION 2); 
+0

感谢select语句的结束,这工作,如果我自己运行查询,但是,当我把它放在一个CreateView语句它回来了一个语法错误,我已更新问题查询语句以包含所有代码 – WraithNath

+0

请参阅我编辑的答案。 –

+0

谢谢,生病了我的视线链,直到我找到它需要去的地方,它从顶级的存储过程中调用,它在日期范围内采用两个参数。我在它的日期表上已经有一个最大递归提示,所以它听起来像我需要另一个正在被旋转的视图。 – WraithNath