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

Откуда:
Сообщений: 10
CREATE FUNCTION [dbo].[GetTopParent]
 (@AccountID BIGINT)

RETURNS NVARCHAR(20)
AS
BEGIN
	-- Declare the return variable here
	DECLARE @ParentId BIGINT
	;with cte as
(  select t.[Account ID], t.[Parent Org Row], 1 as level
   from [SR].[AllAccounts] t
   where t.[Account ID] = @AccountID
   
   union all
   
   select t.[Account ID], t.[Parent Org Row], c.level + 1 as level
   from cte c
        inner join [SR].[AllAccounts] t on t.[Account ID] = c.[Parent Org Row]
)
	SELECT @ParentId = (
					select top(1) c.[Account ID]
					from cte c
					order by c.level DESC
					)
	-- OPTION (MAXRECURSION 0);
	-- Add the T-SQL statements to compute the return value here
	RETURN @ParentId

END


Выполнение функции дает ошибку:
The statement terminated. The maximum recursion 100 has been exhausted before statement completion.

Пробовал запускать с OPTION (MAXRECURSION 0) - по ходу происходит зацикливание.
Други, подскажите, как изменить код, чтобы этого не происходил, пожалуйста. Заранее спасибо!

Сообщение было отредактировано: 18 фев 14, 17:17
18 фев 14, 17:00    [15583955]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Glory
Member

Откуда:
Сообщений: 104751
hameleon
Други, подскажите, как изменить код, чтобы этого не происходил, пожалуйста.

Наверное надо изменить данные, чтобы рни не содержали циклов
18 фев 14, 17:02    [15583975]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
hameleon
Member

Откуда:
Сообщений: 10
Glory, спасибо! :)
18 фев 14, 17:15    [15584099]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
чет я не ослил зачем там вообще рекурсия если в итоге читаеться 1 переменная то самого нижнего уровня ?
18 фев 14, 18:05    [15584489]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
hameleon
Member

Откуда:
Сообщений: 10
Maxx, дык а как по-другому-то определить родительскую запись верхнего уровня?
18 фев 14, 18:36    [15584650]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Скалярка, а не инлайн, не HierarchyID (решает 2 проблемы - зацикленность и отсутствие рекурсии)
Прям джентльменский набор тормозов. :)
Зацикленность решается не после при каждом вызове, а до попадания в базу (данные в базе - чище брильянта).

Maxx - не дерево, а лес.
19 фев 14, 04:49    [15586796]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
vartAG
Member

Откуда:
Сообщений: 17
а почему бы не обойтись обычным циклом?

CREATE FUNCTION [dbo].[GetTopParent]
 (@AccountID BIGINT)

RETURNS NVARCHAR(20)
AS
BEGIN
	-- Declare the return variable here
	DECLARE @ParentId    BIGINT
	      , @tmpParentId BIGINT
	
	select @tmpParentId = 0
	
	while(@AccountID is not null)
	begin
	  select @AccountID = [Parent Org Row]
	    from [SR].[AllAccounts]
	   where [Account ID] = @AccountID
    
    if(@AccountID is not null)
      select @ParentId  = @tmpParentId
	end
	
	RETURN @ParentId

END


Сообщение было отредактировано: 20 фев 14, 12:24
19 фев 14, 15:55    [15591100]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
vartAG,

FacePalm.jpg
19 фев 14, 22:07    [15594010]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
vartAG
Member

Откуда:
Сообщений: 17
Mnior,
поясни
20 фев 14, 12:13    [15596870]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Что есть в этом коде что улучшает имеющийся?
Если ничего не решает - нет смысла постить.
Как альтернатива, в отрыве от всё сказанного другими?
"В отрыве от" - есть недалёкость и непонимание ни последствий ни сути вещей.

Императивизм ... уже много плохого.
Банально - скалярная процедура (скалярная функция) это уже тормоза. Если в первом случае один запрос можно переделать в параметризованное представление (inline функцию), то ваш не получится. А если вы не понимаете различий между ними, то .... Поищите на форуме обсуждения. Их тысячи.
Но это не к императивизму даже.

Серьёзно, мне уже лень повторятся почему пропаганда императива - полный сакс.
Недалёкие всё равно не поймут, а остальные и так понимают это.
Декларативный подход структурирует знания (а не их частный результат), из базовых знаний система автоматом может вывести (сразу или потом) кучу всего, что при императиве даже не закладывается. Бла-бла-бла ...
Зачем, для чего и почему именно так? Вот вопросы на которые надо знать ответы.
"Ну оно же фунчиклирует" - не ответ.


Скажу так. Если вы не знаете суть и мнение "противоположной стороны" - т.е. "Не читал, но осуждаю", то говорить (и тем более "спорить") не о чем.
В реальном понимании что есть лучше, а что нет - не может быть пробелов в знании.

PS: Понимаю что мало что можно понять из этого. Но уже задолбало разжёвывать.
Но если сами захотите разобраться (а это само по себе уже 80% дела), то темы для поиска и копания дал.
Что-то большее - извините, вас много, а времени мало.
PPS: Ссори что в таком противоборствующем и напутственном стиле написано. Надеюсь на понимание.
20 фев 14, 18:31    [15600696]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31912
vartAG
а почему бы не обойтись обычным циклом?
CTE и есть обычный цикл, но есть надежда, что он будет работать потенциально быстрее, поскольку реализован в движке сиквела.
20 фев 14, 19:41    [15601064]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
alexeyvg
CTE и есть обычный цикл, но есть надежда, что он будет работать потенциально быстрее, поскольку реализован в движке сиквела.
Вообще-то я тут позиционирую что он написан более декларативно чем последовательность действий в императивном коде.

Ибо:
1. CTE не означает быстрее.
2. Императивный TSQL скрипт не означает медленее

Уже компилируемые процедуры 2014 будут быстрее чем CTE. (если мне не изменяет память, когда тестил)
Более того, казалось бы "императивные" команды проца нельзя убыстрить - они тупо исполняются. Ан нет! Процессоры умеют анализировать императивный код и находить зависимости и менять местами команды или выполнять параллельно. (см барьеры памяти)

Просто декларативный код предсказуемый/определён ссори за тавтологию. Он описывает ЧТО, а не КАК.
КАК тяжело до-оптимизировать и исправлять ошибки недопонимания ситуации, ибо КАК определяется знаниями программиста. А ЧТО:
- снимает с проггера задачу продумать КАК, притом оптимально
- не привязывается к уровню понимания проггера
- может подстраиваться под контекст выполнения (очень юзабельная вещь, не только в скуле)
- может эволюционировать при неизменном коде (при апгреде компилятора, читай версии скуля)

alexeyvg
CTE и есть обычный цикл
Вы не точны. Реализация CTE в текущей версии скуля есть обычный цикл. Притом довольно посредственно реализованный.
Можно при том же самом CTE придумать несколько реализаций. Параллелизацию там подключить, кэширование или выворачивать на изнанку или вообще убирать куски выполнения, заведомо бесполезные/ложные.

Теория рекурсивных функций не всегда подразумевает циклы. Ибо из циклического описания можно выводить формулу результата, которая считается в один шаг.
Вот напишет говнокодер CTE на константной табле, а компилятор (SQL 2050) куяк и "Constant Scan" оператор вместо циклов.
И это простой случай теории.
20 фев 14, 21:59    [15601697]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
alexeyvg,

Вы объясняете "для народа", а я тут языком мельчешу.
Кесарю кесарево?
20 фев 14, 22:01    [15601708]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31912
Mnior
Вы объясняете "для народа", а я тут языком мельчешу.
Вдруг ТС, прочитав ваш пост слова в вашем посте, подумает что нибуть неприличное?
Mnior
PS: Понимаю что мало что можно понять из этого.

:-)
20 фев 14, 23:04    [15602066]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
vartAG
Member

Откуда:
Сообщений: 17
Чет тут болото развели на пустом месте )

Спросили как реализовать другим способом без CTE - я привел пример.

"Если ничего не решает - нет смысла постить.", а мне больше нравится пословица "Умный любит учиться, а дурак учить".
21 фев 14, 13:04    [15604521]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
vartAG
Mnior, поясни
vartAG
Чет тут болото развели на пустом месте )
До бана недалеко осталось.
vartAG
а мне больше нравится пословица "Умный любит учиться, а дурак учить".
Если вы следуете вашей пословице, то лицемерите однако, вы же запостили вашу поделку, уча людей плохому.
21 фев 14, 19:55    [15607613]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
vartAG
Member

Откуда:
Сообщений: 17
Mnior,

Опять кроме болтовни ничего внятного в ответ, никакой аргументации, как в анекдоте - "я Дартаньян, а вы все п...".
С тобой никто воевать не настроен, но если ты давно работаешь с сиквелом, то знаешь как сейчас учат в институтах, какие студенты приходят оттуда, им вдалбливают эти CTE и они как обезьяны с гранатами их везде вставляют по делу и без, так что мой пример является всего лишь альтернативой, о которой и спрашивал автор. А вот как писать запросы каждый решает сам и если база децентрализована, как у автора, то зачем вбивать гвозди в крышку этого гроба?

На счет бана ты меня посмешил, с каких пор за высказывание своего мнения сажают? )
24 фев 14, 09:48    [15617292]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
+ vartAG
vartAG
Опять кроме болтовни ничего внятного в ответ, никакой аргументации
Т.е. Объяснения почему CTE может быть быстрее это не аргументация, что скалярки - тормоза, это тоже не аргумент? А когда "своё мнение" аля "тупо плохо" и всё это аргументация?
vartAG
но если ты давно работаешь с сиквелом, то знаешь как сейчас учат в институтах
vartAG
как в анекдоте - "я Дартаньян, а вы все п..."
Это ты себя описывал?
vartAG
им вдалбливают эти CTE
Посмешил. Вокруг в 90% как ты, ничего кроме циклов и кучей IF думать не умеют.
Где твои доводы ЗА твой вариант?
vartAG
обезьяны с гранатами их везде вставляют по делу и без
Возможно, но это всё приведено не в тему.
1. Ни ты свой вариант не аргументировал
2. Ни какого отношения не имеет в пользу/протим твоего/остальных вариантов.
Принцип "отвлечённого аргумента" - давай не надо. Ок?

То что ставят CTE где ни попадя, это на значит "надо бороться с этим CTE". Это всё идиотизм.
Кстати, коль ты хочешь отвести разговор в сторону, скажи уже, где ставят не попадя. Я что-то очень-очень мало видел когда это делают. А вот курсоры лепить и циклы - это все горазд. Скалярки и море команд - это сплошь и рядом.

vartAG
мой пример является всего лишь альтернативой, о которой и спрашивал автор
Аргументы где?
Если ты такой из себя спеца корчишь, много говорил что неучи, так причём тут "всего лишь альтернативой", расскажи чем лучше твой вариант? Хотя бы один довод.

vartAG
А вот как писать запросы каждый решает сам и если база децентрализована, как у автора, то зачем вбивать гвозди в крышку этого гроба?
Причём тут децентрализация?
vartAG
На счет бана ты меня посмешил, с каких пор за высказывание своего мнения сажают? )
Не за мнение, а за неуважение к собеседнику. Просить ответ а потом хаить.
А за бан только сажают? Я думал расстреливают. Бедный, не справедливо то как.

Только это, опиши хоть один аргумент, иначе точно сольют.
Пиши по делу. Нет - нефег фигнёй страдать.
24 фев 14, 22:30    [15622859]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
vartAG
Member

Откуда:
Сообщений: 17
Mnior,

Опять грубишь, сам всякую ерунду постишь, потом еще и людей обвиняешь в этом. Пусть автор решает надо ему это или нет, а не всякие "профи". Вопрос закрыт.
25 фев 14, 10:19    [15623905]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в рекурсивной функции  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
vartAG
Опять грубишь
Где? Вот вы да.
vartAG
сам всякую ерунду постишь
Ну и где? Опять же - от вас ничего полезного.
vartAG
потом еще и людей обвиняешь в этом.
Обоснованно, а вы нет.
vartAG
Пусть автор решает надо ему это или нет, а не всякие "профи".
Ему кто-то запрещает? А вы запрещаете - высказывать мнение. Кто вы такой чтобы запрещать. Я вам запрещаю постить? Я просто говорю что это бессмысленно, а так постите говнокод дальше.
25 фев 14, 17:50    [15627946]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить