Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
Простейший запрос if (1=0) begin declare @foo int = 1; end select @foo; В результате дает на выходе NULL. То есть переменная объявилась, хотя условие не соблюдено. Я правильно понимаю, что скуль при анализе объявляет все переменные, а потом уже смотрит на условия IF и, следуя условию, присваивает значение и именно по этому я имею видимость переменной. Может быть есть некий порядок при разборе блока. Что то типа "сначала объявляем и сохраняем в памяти все переменные, далее IF, далее еще что нибудь...."? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 18:52 |
|
||
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
Ёжик25, Видимость переменных в SQL - батч, поэтому все объявления переменных фактически происходят в начале батча. Если у вас есть взаимоисключающие ветки кода с объявлением одной и той же переменной, вы получите ошибку еще на этапе компиляции Код: sql 1. 2. 3. 4. 5. 6. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 18:59 |
|
||
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
msLex Ёжик25, Видимость переменных в SQL - батч, поэтому все объявления переменных фактически происходят в начале батча. Если у вас есть взаимоисключающие ветки кода с объявлением одной и той же переменной, вы получите ошибку еще на этапе компиляции Код: sql 1. 2. 3. 4. 5. 6. ну тогда можно было бы авторSET @foo = 2 declare @foo int = 1; точно не знаю, но имхо внутри IF определение срабатывает из-за того что компилятор уловия всё равно комилирует и в результате выносить declare в начало ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:03 |
|
||
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
msLex, Вот оно что. Благодарю. На самом деле я с этим столкнулся, объявляя табличную переменную в теле курсора. Почему то мне всегда казалось, что каждая "итерация" курсора - это отдельный батч. Вышло, что табличная переменная копила данные при каждом прохождении по курсору. И игнорируется каждый раз ее объявление. Во всяком случае не выдает ошибку. Вот именно это меня смутило. Тогда выходит, что скуль собирает при разборе информацию об объявлениях переменных, а потом игнорирует все declare, если они для переменных с таким же именем опять встречаются по ходу логики выполнения ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:09 |
|
||
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
[quot TaPaK#22026009] msLex Ёжик25, точно не знаю, но имхо внутри IF определение срабатывает из-за того что компилятор уловия всё равно комилирует и в результате выносить declare в начало Если он компилируется условия "все равно", то значит тратит на это ресурсы. И по логике выходит, что я могу миллион конструкций с IF накрутить, при этом ничего выполняться не будет, но ресурсы потратятся? Типа IF 1=0, else if 2=0 и так далее... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:12 |
|
||
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
Ёжик25 Если он компилируется условия "все равно", то значит тратит на это ресурсы. И по логике выходит, что я могу миллион конструкций с IF накрутить, при этом ничего выполняться не будет, но ресурсы потратятся? Типа IF 1=0, else if 2=0 и так далее... Да вот так, вы тоже получите ошибку Код: sql 1. 2. 3. 4. TaPaK msLex Ёжик25, Видимость переменных в SQL - батч, поэтому все объявления переменных фактически происходят в начале батча. Если у вас есть взаимоисключающие ветки кода с объявлением одной и той же переменной, вы получите ошибку еще на этапе компиляции Код: sql 1. 2. 3. 4. 5. 6. ну тогда можно было бы авторSET @foo = 2 declare @foo int = 1; точно не знаю, но имхо внутри IF определение срабатывает из-за того что компилятор уловия всё равно комилирует и в результате выносить declare в начало тут, похоже, все сложнее вот это работает Код: sql 1. 2. 3. 4. а вот это нет Код: sql 1. 2. 3. 4. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:20 |
|
||
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
msLex тут, похоже, все сложнее ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.11.2019, 19:59 |
|
||
|
Порядок выполнения команд и объявление переменной
|
|||
|---|---|---|---|
|
#18+
Ёжик25, переменные инициализируются при первом проходе один раз, в рантайме все инициализации игнорируются. Например, Вы можете объявить переменную в блоке кода, в который выполнение никогда не попадает, тем не менее, код будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.11.2019, 11:09 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=39895085&tid=1686885]: |
0ms |
get settings: |
8ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 218ms |
| total: | 348ms |

| 0 / 0 |
