我有一个查询,该查询返回的错误超过了最大递归级别。
我知道如何通过添加OPTION (maxrecursion 0)到查询中来解决此问题,但是,我尝试将其添加到查询中的各个位置,但无法找到将其放在语法有效的位置。
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
如建议的那样,我在最后一个GO语句的上方添加了 OPTION(maxrecursion 0) ,但是在create view语句中却给出了语法错误。如果我自己运行查询,则它在create view语句之外运行
通常,在使用递归cte的select语句的末尾。 但是,在视图内将行不通。快速搜索将我带到了这篇文章-解释了正确的方法。
原来,您不能在视图内部使用查询提示,但是可以并且应该在调用视图的查询中使用它。
样表:
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);