Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Теоретический вопрос о последовательности, в которой сервер выполняет инструкции / 9 сообщений из 9, страница 1 из 1
22.07.2021, 11:32
    #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
22.07.2021, 11:56
    #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
22.07.2021, 11:59
    #40085342
Владислав Колосов
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
RuCosinus,

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

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

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

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


https://stackoverflow.com/questions/3945361/set-versus-select-when-assigning-variables
...
Рейтинг: 0 / 0
22.07.2021, 13:59
    #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
22.07.2021, 15:28
    #40085436
RuCosinus
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
Всем спасибо, с отличиями разобрался.
...
Рейтинг: 0 / 0
22.07.2021, 15:35
    #40085438
komrad
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Теоретический вопрос о последовательности, в которой сервер выполняет инструкции
a_voronin,

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


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