SQL Server:语句完成之前最大递归100已用尽
我有一个查询返回的错误超过了递归的最大级别。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语句,但是当创建视图语句内它是给一个语法错误。如果我自己运行查询,它在创建视图语句之外运行
通常,在使用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);
感谢select语句的结束,这工作,如果我自己运行查询,但是,当我把它放在一个CreateView语句它回来了一个语法错误,我已更新问题查询语句以包含所有代码 – WraithNath
请参阅我编辑的答案。 –
谢谢,生病了我的视线链,直到我找到它需要去的地方,它从顶级的存储过程中调用,它在日期范围内采用两个参数。我在它的日期表上已经有一个最大递归提示,所以它听起来像我需要另一个正在被旋转的视图。 – WraithNath
在使用该recurcive CTE –