SQL Server : the maximum recursion 100 has been exhausted before statement completion

标签 sql sql-server query-hints

我有一个查询返回错误,并且超出了最大递归级别。

我知道如何通过添加 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 语句的上方,但是在创建 View 语句中时,它会出现语法错误。如果我在创建 View 语句之外单独运行查询,它就可以工作

最佳答案

通常,在使用递归 cte 的 select 语句的末尾。
然而,在一个 View 里面是行不通的。 快速搜索让我找到了this post - 这解释了正确的方法。

事实证明,您不能在 View 内使用查询提示,但您可以而且应该在调用 View 的查询中使用它。

示例表:

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

创建 View :

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

执行 View :

SELECT *
FROM V
OPTION (MAXRECURSION 2);

关于SQL Server : the maximum recursion 100 has been exhausted before statement completion,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41183822/

相关文章:

sql查询问题一步一步

java - 在 DB2 中插入期间 SQLCODE=-723

sql-server - 聚合函数 - 按自定义顺序排列的第一个 nvarchar

Oracle 将 Select Union All 转换为 Parallel Select

sql - Oracle LEADING 提示——为什么需要这样做?

linq-to-sql - 如何在 Linq to SQL 中使用 NOEXPAND 提示?

c# - SQL 差异 EF 6 与 EF Core

php - 使用 PHP 计算年龄时得到错误的结果

sql-server - 加速 SSIS 包(插入和更新)

sql-server - 划分结果以运行总计查询