omni.infra Ответов: 2

Получение ошибки " оператор завершается. Максимальная рекурсия 100 была исчерпана до завершения оператора.


Я использую эту нижеприведенную функцию для получения родительского дочернего кода для филиала с головным офисом. Но по ошибке эти два значения были обновлены до нуля, и теперь, когда я вызываю эту функцию , получаю ошибку "The statement terminated. The maximum recursion 100 has been exhausted before statement completion."...Пожалуйста, проводите

CREATE FUNCTION [dbo].[FUN_GETCHILD_CODE](@LEVEL_NO   VARCHAR(20),@PARENT_CODE VARCHAR(20), @CHILD_CODE  VARCHAR(20))       
RETURNS @Values TABLE( CHILD_CODE VARCHAR(20),CHILD_DESC VARCHAR(200),PARENT_CODE VARCHAR(20),LEVEL_NO VARCHAR(20),LEVEL_CODE VARCHAR(20))  AS      
BEGIN     
   
IF @LEVEL_NO = 'NULL'   
SET @LEVEL_NO='0'  
  
IF @PARENT_CODE = 'NULL'   
SET @PARENT_CODE='0'  
  
IF @CHILD_CODE = 'NULL'   
SET @CHILD_CODE='0';  
   
WITH LEVEL_PARENT(CHILD_CODE, CHILD_DESC, PARENT_CODE,LEVEL_CODE) AS    
(    
       
          SELECT CHILD_CODE, CHILD_DESC, PARENT_CODE,LEVEL_CODE    
          FROM TB_LEVELS_PARENT_CHILD     
          WHERE     
   PARENT_CODE = @PARENT_CODE OR CHILD_CODE = @CHILD_CODE    
          UNION ALL    
          SELECT E.CHILD_CODE, E.CHILD_DESC, E.PARENT_CODE,E.LEVEL_CODE    
          FROM TB_LEVELS_PARENT_CHILD E     
          INNER JOIN LEVEL_PARENT P ON P.CHILD_CODE = E.PARENT_CODE    
)    
INSERT INTO @Values ( CHILD_CODE,CHILD_DESC,PARENT_CODE,LEVEL_NO,LEVEL_CODE)    
SELECT A.CHILD_CODE, A.CHILD_DESC, A.PARENT_CODE,B.LEVEL_NO,A.LEVEL_CODE     
FROM LEVEL_PARENT A,TB_LEVEL_MASTER B    
WHERE     
A.LEVEL_CODE = B.LEVEL_CODE AND    
B.LEVEL_NO = @LEVEL_NO     
ORDER BY LEVEL_NO DESC,PARENT_CODE DESC    
RETURN    
END  


Что я уже пробовал:

SELECT DISTINCT CHILD_CODE CHILD_CODE FROM FUN_GETCHILD_CODE('1','HO','HO')

2 Ответов

Рейтинг:
1

Maciej Los

Пожалуйста, обратитесь к этим:
Заявление оборвалось. Максимальная рекурсия 100 была исчерпана до завершения оператора. | SqlHints.com[^]
Рекурсивный CTE – максимальная рекурсия 100 была исчерпана | SQL с Manoj[^]

Там вы найдете инструкцию, как избежать подобных ошибок. В данный момент Вы должны писать правильно WHERE statment который может помочь вам остановить цикл или вы можете просто ограничить лимит циклов определенным числом с помощью OPTION (MAXRECURSION YourNumberHere) в конце заявления.

Подробнее на сайте MSDN:
С common_table_expression (Transact-SQL)[^]
Использование Общих Табличных Выражений[^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[^]
Оптимизация рекурсивного CTE-выражения запроса | SQL сервером поддержки консультативной группы[^]


omni.infra

я добавил опцию (MAXRECURSION 32767) , и теперь ошибка, с которой я снова сталкиваюсь, такова
"Заявление прекращено. Максимальная рекурсия 32767 была исчерпана до завершения оператора." Пожалуйста, совет

Maciej Los

Что ж... Похоже, вы не читали рекомендуемых статей. OPTION(MAXRECURSION NoOfRecursions) вы должны использовать, если вы абсолютно уверены, что CTE делает и чего вы хотите достичь. Я бы рекомендовал вам прочитать соответствующие статьи, а затем исправить WHERE оператор для остановки бесконечного цикла.

CPallini

5.

Maciej Los

Спасибо, Карло.

Рейтинг:
1

Patrice T

Цитата:
эти два значения были обновлены до нуля
Каждая строка обновляется с нулем теперь ее собственные родитель и ребенок.
Это бесконечный цикл.
восстановите родительские и дочерние значения или измените логику запроса.