Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Glory
Member

Откуда:
Сообщений: 104760
MaxNevermind
Кто-нибудь может привести пример рекурсивного запроса который:
1) Нельзя написать проще не используя рекурсивного запроса

Любая рекурсия эмулируется циклом.

MaxNevermind
Какой смысл так писать, можно обойтись обычным циклом,

Только цикла будет два.
Примеры из литерартуры нужны, чтобы показать как работает тот или иной функционал
Это не реальные системы и задачи.
22 фев 13, 11:37    [13965720]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4537
MaxNevermind, Вам руки чтоль крутят, аль паяльником пытают... не хотите так делать... не видите достойного применения... ну так и не используйте...
P.S.: В скль "читабельность" не самый приоритетный фактор...
22 фев 13, 11:39    [13965734]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Владимир Затуливетер
Member

Откуда:
Сообщений: 427
buser
MaxNevermind, Вам руки чтоль крутят, аль паяльником пытают... не хотите так делать... не видите достойного применения... ну так и не используйте...
P.S.: В скль "читабельность" не самый приоритетный фактор...


Да не приоритетный, но тоже важный. (Жуть как не люблю не отформатированные запросы).
Это я не в поддержку циклов если что :-)
Это в поддержку форформатирования.
22 фев 13, 11:49    [13965798]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3282
MaxNevermind
Вот например пример из той же книги
Идиотский пример, но видимо автору не пришло в голову ничего более правдоподобного.

Реальная ситуация, когда рекурсия спасает - обход дерева.

Кроме того, оптимальность - это не только быстрое выполнение, это еще и количество используемых ресурсов. Процессор, память, диски, налагаемые блокировки - тут все важно.
22 фев 13, 11:50    [13965812]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
iap
+
SIMPLicity_
пропущено...

Агамс.... "Как убить подвесить серовер"... Внутри функций, кажется, не работает...

вот так работает:

with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
 option (maxrecursion 10)


а вот так - ниххерра :
create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl
option (maxrecursion 10) /* но если эту строку закоментить, то всё будет зайэпись */

)
 go

select * from  f_test(null)
option относится ко всему внешнему запросу.
Пишите внутри функции без option, а option ставьте для SELECTа из функции.
В том числе и option(maxrecursion 10)


iap, я не о "select top 10 ... " писал...

... или Вы что-то другое имели в виду? Если таки да, то код нарисуйте.
Ну и это,- "заранее спасибо".
22 фев 13, 13:59    [13966864]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
SIMPLicity_
iap
+
пропущено...
option относится ко всему внешнему запросу.
Пишите внутри функции без option, а option ставьте для SELECTа из функции.
В том числе и option(maxrecursion 10)


iap, я не о "select top 10 ... " писал...

... или Вы что-то другое имели в виду? Если таки да, то код нарисуйте.
Ну и это,- "заранее спасибо".


create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select * from tbl

)
 go

select * from  f_test(null)
option (maxrecursion 10) /* но если эту строку закоментить, то всё будет зайэпись */
22 фев 13, 14:03    [13966899]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
Ух ты!!!
Спасибо!...
Только подглядеть "как оно работает" не удалось:

drop function f_test ;
go

create function f_test (@rec integer = 10) returns table

return
(
with tbl  as  (
select 1 as id
union all
select id+1 as id from tbl
where id < 20
)
select top 99 percent * from tbl 
order by id desc
)
 go

select * from  f_test(null) 

option (maxrecursion 10)


возвращает пустую таблицу...
22 фев 13, 14:18    [13966971]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
iap
Member

Откуда: Москва
Сообщений: 47007
SIMPLicity_,

потому что в рекурсии получилось больше, чем 10 уровней (20).
А если достигается разрешённый максимум (maxrecursion), то возвращается сообщение об этом и - облом.
То есть, option - это не для ограничения результирующего датасета, а для контроля заданных условий выполнения запроса.
22 фев 13, 14:25    [13967028]     Ответить | Цитировать Сообщить модератору
 Re: Объясните принцип передачи параметра при рекурсивном вызове ф-ии.  [new]
SIMPLicity_
Member

Откуда: (((@)))
Сообщений: 8757
iap
SIMPLicity_,

потому что в рекурсии получилось больше, чем 10 уровней (20).
А если достигается разрешённый максимум (maxrecursion), то возвращается сообщение об этом и - облом.
То есть, option - это не для ограничения результирующего датасета, а для контроля заданных условий выполнения запроса.


Т.е. maxrecursin как бы нахлобучивается сверху на f_test и её выполнение происходит уже в рамках "нахлобученного" значения maxrecursion... Выходит так, да?

PS В запросе (без функции) кроме сообщения о достигнутом уровне таки выводится таблица...
PPS В принципе, это уже "академический" интерес так как я каким-то образом решил поставленные задачи... Ну, всё равно, спасибо,- буду знать... :)
22 фев 13, 18:12    [13968479]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 [2]      все
Все форумы / Microsoft SQL Server Ответить