Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Рекурсивный вызов функции.
|
|||
|---|---|---|---|
|
#18+
Есть определенный код (функции), вызывающие сами себя. с трудом понимаю, почему конструкция select id from fnF1(@string, @delimiter) WHERE CHARINDEX('|', @string) <> 0 вообще передает управление в фукнцию, если по входным параметрам условие не выполняется. в итоге получаю при входных параметрах SELECT * FROM fnF2('3',',') бесконечную рекурсию. Сформулирую то что интересует. 1) можно ли изменить блок так, чтобы управление в функцию не попадало когда в строке нет '|'? select id from fnF1(@string, @delimiter) WHERE CHARINDEX('|', @string) <> 0 2) как определить "уровень" цикла самовызова в фукнции fnF1, чтобы добавить дополнительное условие от зацикливания. Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 17:26 |
|
||
|
Рекурсивный вызов функции.
|
|||
|---|---|---|---|
|
#18+
Ну и жуть... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 18:27 |
|
||
|
Рекурсивный вызов функции.
|
|||
|---|---|---|---|
|
#18+
invmНу и жуть... Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. э.. спс ) Но это не поясняет заданные вопросы. Я упростил реальный код чтобы показать конкретно то, что меня удивило. в реальном проекте там более сложные блоки Пока ушел в вариант Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 19:43 |
|
||
|
Рекурсивный вызов функции.
|
|||
|---|---|---|---|
|
#18+
Dzianisэто не поясняет заданные вопросы.См. план выполнения - там фильтр применяется к результату функции fnF1, т.е. уже после ее выполнения. Так происходит потому что значения параметров при вызове - константы времени выполнения. Результат такой функции считается статическим и кешируется для возможного многократного использования далее в запросе. Поставив костыль в виде cross apply, вы обманули оптимизатор и теперь он считает значения параметров не константными. Но никто не гарантирует, что в следующей версии или в SP, или в CU оптимизатор не поумнеет и не станет опять считать параметры константными. ЗЫ: В 99.9% случаев, подобные вещи, даже при наличии "более сложных блоков кода", решаются без подобных рекурсивных извращений. Пример как это сделать был продемонстрирован. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 22:40 |
|
||
|
Рекурсивный вызов функции.
|
|||
|---|---|---|---|
|
#18+
invmТак происходит потому что значения параметров при вызове - константы времени выполнения. Результат такой функции считается статическим и кешируется для возможного многократного использования далее в запросе. В общем то случае разумно. Раз юзаются переменные "извне", значит 1 раз посчитать и запомнить. invmЗЫ: В 99.9% случаев, подобные вещи, даже при наличии "более сложных блоков кода", решаются без подобных рекурсивных извращений. Пример как это сделать был продемонстрирован. Согласен. сами функции сильно перекликаются, значит в принципе можно переработать код обоих и создать одну, без рекурсий. Но это чужой код, более сильная переработка - план на будущее. Есть ли еще другие способы "более стабильно" обмануть оптимизатор? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 23:26 |
|
||
|
Рекурсивный вызов функции.
|
|||
|---|---|---|---|
|
#18+
DzianisЕсть ли еще другие способы "более стабильно" обмануть оптимизатор? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2018, 23:59 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=126&tid=1688783]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
2ms |
| others: | 259ms |
| total: | 400ms |

| 0 / 0 |
