Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Как узнать, на для какого id происходит превышение максимальной глубины рекурсии?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 237
Здравствуйте!

Есть табличная функция с использованием рекурсивного CTE:
ALTER FUNCTION [mrsk].[check_sub_docs](	@doc_link int
)
RETURNS @docs TABLE(
	whose INT
	, LINK INT
	, doc_type INT
	, contract_status INT
	, level INT
) AS
BEGIN
	;WITH Childs(whose, LINK, doc_type, contract_status, Level) as (
		SELECT
			d.link, d.link, d.F_Docum_Types, d.F_Contract_Status, 1
		FROM dbo.DD_Docs d
		WHERE
			LINK = @doc_link
		UNION ALL
		SELECT
			c.whose, d.link, d.F_Docum_Types, d.F_Contract_Status, c.Level + 1
		FROM dbo.DD_Docs d
		JOIN Childs c ON c.whose = d.F_Docs
	)
	INSERT INTO @docs
	SELECT * FROM Childs
	OPTION (MAXRECURSION 777);
	RETURN
END

Для какого-то @doc_link происходит превышении максимально допустимой глубины рекурсии, возникает ошибка для нижеследующего запроса:
SELECT
	TP_LINK
	, CASE WHEN 
		EXISTS( SELECT 1 FROM mrsk.check_sub_docs(DD_LINK) WHERE doc_type = @DST_Route_List_Invent AND contract_status NOT IN( @CS_Done, @DCS_Cancelled_Out) )
			THEN 1 ELSE 0 
	END not_finished
FROM #temp


Как можно узнать, для какого @doc_link(DD_LINK) это происходит?

желаю Вам счастья

Сообщение было отредактировано: 18 ноя 20, 17:49
18 ноя 20, 17:50    [22234810]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, на для какого id происходит превышение максимальной глубины рекурсии?  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1590
Борис Гаркун,

повысить порог рекурсии больше допустимого и выводить строки у которых Level > 777
18 ноя 20, 18:28    [22234832]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, на для какого id происходит превышение максимальной глубины рекурсии?  [new]
iap
Member

Откуда: Москва
Сообщений: 47024
felix_ff
Борис Гаркун,

повысить порог рекурсии больше допустимого и выводить строки у которых Level > 777
Там, небось, бесконечная рекурсия.
Лучше в рекурсии прописать WHERE Level<778 и
SELECT TOP(1) WITH TIES * FROM Childs ORDER BY Level DESC
18 ноя 20, 18:45    [22234851]     Ответить | Цитировать Сообщить модератору
 Re: Как узнать, на для какого id происходит превышение максимальной глубины рекурсии?  [new]
Борис Гаркун
Member

Откуда: Лермонтов
Сообщений: 237
Здравствуйте! Спасибо.
Да я похоже ошибся в рекурсии. Вот так заработало:
ALTER FUNCTION [mrsk].[check_sub_docs](	@doc_link int
)
RETURNS @docs TABLE(
	whose INT
	, LINK INT
	, doc_type INT
	, contract_status INT
	, level INT
) AS
BEGIN
	;WITH Childs(whose, LINK, doc_type, contract_status, Level) as (
		SELECT
			d.link, d.link, d.F_Docum_Types, d.F_Contract_Status, 1
		FROM dbo.DD_Docs d
		WHERE
			LINK = @doc_link
		UNION ALL
		SELECT
			c.whose, d.link, d.F_Docum_Types, d.F_Contract_Status, c.Level + 1
		FROM dbo.DD_Docs d
		JOIN Childs c ON c.LINK = d.F_Docs
	)
	INSERT INTO @docs
	SELECT * FROM Childs
	OPTION (MAXRECURSION 777);
	RETURN
END
19 ноя 20, 11:29    [22235178]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить