2016-12-16 3 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

Обычно, в конце оператора select, который использует recurcive cte.
Однако, внутри вид, который не будет работать. Быстрый поиск дал мне 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 

Execute вид:

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

Спасибо, это работает, если я запускаю запрос сам по себе, однако, когда я помещаю его в оператор CreateView, он возвращается с синтаксическая ошибка, я обновил запрос запроса вопроса, чтобы включить весь код – WraithNath

+0

См. мой отредактированный ответ. –

+0

Спасибо, я работаю над цепочкой просмотров, пока не найду, куда ей нужно идти, ее вызов из хранимой процедуры на верхнем уровне, который принимает два параметра для диапазона дат. У меня есть подсказка о макс рекурсии уже в таблице дат, на которой она поворачивается, поэтому мне кажется, что мне нужно другое в рассматриваемом представлении. – WraithNath

Смежные вопросы