powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Порядок выполнения команд и объявление переменной
9 сообщений из 9, страница 1 из 1
Порядок выполнения команд и объявление переменной
    #39894665
Ёжик25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простейший запрос
if (1=0)
begin
declare @foo int = 1;
end
select @foo;

В результате дает на выходе NULL. То есть переменная объявилась, хотя условие не соблюдено. Я правильно понимаю, что скуль при анализе объявляет все переменные, а потом уже смотрит на условия IF и, следуя условию, присваивает значение и именно по этому я имею видимость переменной. Может быть есть некий порядок при разборе блока. Что то типа "сначала объявляем и сохраняем в памяти все переменные, далее IF, далее еще что нибудь...."?
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39894670
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёжик25,

Видимость переменных в SQL - батч, поэтому все объявления переменных фактически происходят в начале батча. Если у вас есть взаимоисключающие ветки кода с объявлением одной и той же переменной, вы получите ошибку еще на этапе компиляции

Код: sql
1.
2.
3.
4.
5.
6.
if (1=0)
	declare @foo int = 1;
else 
	declare @foo int = 2;

select @foo;
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39894672
TaPaK
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
Ёжик25,

Видимость переменных в SQL - батч, поэтому все объявления переменных фактически происходят в начале батча. Если у вас есть взаимоисключающие ветки кода с объявлением одной и той же переменной, вы получите ошибку еще на этапе компиляции

Код: sql
1.
2.
3.
4.
5.
6.
if (1=0)
	declare @foo int = 1;
else 
	declare @foo int = 2;

select @foo;


ну тогда можно было бы

авторSET @foo = 2
declare @foo int = 1;
точно не знаю, но имхо внутри IF определение срабатывает из-за того что компилятор уловия всё равно комилирует и в результате выносить declare в начало
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39894674
Ёжик25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
msLex,

Вот оно что. Благодарю. На самом деле я с этим столкнулся, объявляя табличную переменную в теле курсора. Почему то мне всегда казалось, что каждая "итерация" курсора - это отдельный батч. Вышло, что табличная переменная копила данные при каждом прохождении по курсору. И игнорируется каждый раз ее объявление. Во всяком случае не выдает ошибку. Вот именно это меня смутило.
Тогда выходит, что скуль собирает при разборе информацию об объявлениях переменных, а потом игнорирует все declare, если они для переменных с таким же именем опять встречаются по ходу логики выполнения
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39894679
Ёжик25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot TaPaK#22026009]
msLex
Ёжик25,

точно не знаю, но имхо внутри IF определение срабатывает из-за того что компилятор уловия всё равно комилирует и в результате выносить declare в начало


Если он компилируется условия "все равно", то значит тратит на это ресурсы. И по логике выходит, что я могу миллион конструкций с IF накрутить, при этом ничего выполняться не будет, но ресурсы потратятся? Типа IF 1=0, else if 2=0 и так далее...
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39894684
msLex
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёжик25
Если он компилируется условия "все равно", то значит тратит на это ресурсы. И по логике выходит, что я могу миллион конструкций с IF накрутить, при этом ничего выполняться не будет, но ресурсы потратятся? Типа IF 1=0, else if 2=0 и так далее...


Да


вот так, вы тоже получите ошибку

Код: sql
1.
2.
3.
4.
if  1=2 
create table #t(id int)
else 
create table #t(id int)


TaPaK
msLex
Ёжик25,

Видимость переменных в SQL - батч, поэтому все объявления переменных фактически происходят в начале батча. Если у вас есть взаимоисключающие ветки кода с объявлением одной и той же переменной, вы получите ошибку еще на этапе компиляции

Код: sql
1.
2.
3.
4.
5.
6.
if (1=0)
	declare @foo int = 1;
else 
	declare @foo int = 2;

select @foo;



ну тогда можно было бы

авторSET @foo = 2
declare @foo int = 1;

точно не знаю, но имхо внутри IF определение срабатывает из-за того что компилятор уловия всё равно комилирует и в результате выносить declare в начало

тут, похоже, все сложнее

вот это работает

Код: sql
1.
2.
3.
4.
if (1=0)
	declare @foo int = 1;
else 
	select @foo;



а вот это нет

Код: sql
1.
2.
3.
4.
if (1=0)
	select @foo;
else 
	declare @foo int = 1;
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39894703
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
msLex
тут, похоже, все сложнее
Или наоборот, проще: тупо что раньше встретится, - объявление или использование, - без учета control flow
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39894917
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ёжик25,

переменные инициализируются при первом проходе один раз, в рантайме все инициализации игнорируются. Например, Вы можете объявить переменную в блоке кода, в который выполнение никогда не попадает, тем не менее, код будет работать.
...
Рейтинг: 0 / 0
Порядок выполнения команд и объявление переменной
    #39895085
Ёжик25
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Владислав Колосов,
благодарю. Вопрос закрыт.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Порядок выполнения команд и объявление переменной
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]