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

如建议的那样,我在最后一个GO语句的上方添加了 ,但是在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);

以上是 SQL Server:语句完成之前,最大递归100已用尽 的全部内容, 来源链接: utcz.com/qa/398306.html

回到顶部