powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
9 сообщений из 9, страница 1 из 1
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085330
RuCosinus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день.

Вопрос может элементарный, но все же.

При необходимости присвоить в подряд пару значений переменным где значение одной зависит от другой, писал две последовательных инструкции, типа вот такого:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
declare
	@Dt1 smalldatetime
	,@Dt2 smalldatetime

select @Dt1 = getdate()
select @Dt2 = DATEADD(mm,-1,@Dt1)

select @Dt1,@Dt2



Проще было бы сделать вот так, но по старой памяти я не был уверен, что не получится какая-нибудь неопределенность.
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
declare
	@Dt1 smalldatetime
	,@Dt2 smalldatetime

select @Dt1 = getdate()
		,@Dt2 = DATEADD(mm,-1,@Dt1)

select @Dt1,@Dt2



Сейчас решил проверить как оно работает, во втором варианте все отрабатывает корректно. Но всегда ли оно будет правильно или может в любой момент сбойнуть? Или оптимизатор отлично разбирается в таких конструкциях и можно смело писать по второму варианту и даже и не думать?
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085341
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuCosinus,

Не гарантируется.

Если хочется именно одной инструкцией, то можно так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
declare
	@Dt1 smalldatetime
	,@Dt2 smalldatetime

select @Dt1 = a.dt
		,@Dt2 = DATEADD(mm,-1,a.dt)
from
 (values (getdate())) a(dt);
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085342
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuCosinus,

второй случай не является документированным. В какой-то из версий сервера он таким способом не работал.

Кроме того,
Для присваивания переменных рекомендуется использовать инструкцию SET @local_variable вместо SELECT @local_variable
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085349
RuCosinus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm,
спасибо, значит я все правильно делал

Владислав Колосов,
да, спасибо. Я обычно пишу set, но если приходится править какие-либо старые процедуры в которых использует select, пишу так же для единообразия. А вы не знаете, чем обусловлено эта инструкция? В чем отличие и почему советуют использовать именно set?
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085373
Владислав Колосов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuCosinus,

когда-то я столкнулся с тем, что инструкция SELECT @var работала некорректно, но деталей не помню, к сожалению. Переменная была не простого типа.
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085409
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
RuCosinus
В чем отличие и почему советуют использовать именно set?


https://stackoverflow.com/questions/3945361/set-versus-select-when-assigning-variables
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085410
Фотография a_voronin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
komrad,

Присваивание является одним из операторов и для него прописано слева направо. А вот запятая в select list в число операторов не включена. Отсюда неопределенность.

Level Операторы
1 ~ (побитовое НЕ)
2 * (умножение), / (деление), % (остаток деления)
3 + (положительное), – (отрицательное), + (сложение), +( объединение), – (вычитание), & (побитовое И), ^ (побитовое исключающее ИЛИ), | (побитовое ИЛИ)
4 =, >, <, >=, <=, <>, !=, !>, !< (операторы сравнения)
5 NOT
6 AND
7 ALL, ANY, BETWEEN, IN, LIKE, OR, SOME
8 = (присваивание)
Если два оператора в выражении имеют один и тот же уровень приоритета, они вычисляются в порядке слева направо по мере их появления в выражении. Например, если выражение использует инструкцию SET, то оператор вычитания будет выполнен до оператора сложения.
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085436
RuCosinus
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, с отличиями разобрался.
...
Рейтинг: 0 / 0
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
    #40085438
Фотография komrad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
a_voronin,

спасибо за абзац незапрошенного текста
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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