Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Поведение переменной в update  [new]
@variablewithupdate
Guest
Добрый день

MS SQL Server 2012
create table test (f1 int identity(1, 1), f2 int, f3 int)

declare @v int

insert into test (f2, f3)
values (null, null), (null, null), (null, null), (null, null), (null, null), (null, null)

update test set 
	@v = case when f1 < 5 then 1 else 0 end,
	f2 = @v*f1,
	f3 = @v * f1 * f1

select * from test

drop table test


выдает

f1	f2	f3
1 1 1
2 2 4
3 3 9
4 4 16
5 0 0
6 0 0

то, что и нужно
хотелось бы найти такое поведение в документации в явном виде

нашел только вот
https://msdn.microsoft.com/en-us/library/ms177523.aspx
expression
Is a variable, literal value, expression, or a subselect statement (enclosed with parentheses) that returns a single value. The value returned by expression replaces the existing value in column_name or @variable

и
https://msdn.microsoft.com/en-us/library/ms177523.aspx
@variable
Is a declared variable that is set to the value returned by expression.
SET @variable = column = expression sets the variable to the same value as the column. This differs from SET @variable = column, column = expression, which sets the variable to the pre-update value of the column


т.е. не понятно когда переменной присваивается значение, может по окончанию выполнения всего запроса или может сначало использоваться в выражении, а только принимать новое значение, кстати если пыполнить update, поменяв местами операторы
update test set 
	f2 = @v*f1,
	f3 = @v * f1 * f1,
	@v = case when f1 < 5 then 1 else 0 end
, то результат будет такой же

хотелось бы найти явное описание в документации, что к моменту использования переменной оно уже имеет нужное значение для текущей записи
киньте ссылку или поясните пожалуйста
23 сен 16, 18:20    [19702039]     Ответить | Цитировать Сообщить модератору
 Re: Поведение переменной в update  [new]
@variablewithupdate
Guest
автор
т.е. не понятно когда переменной присваивается значение, может по окончанию выполнения всего запроса или может сначало использоваться в выражении, а только принимать новое значение, кстати если пыполнить update, поменяв местами операторы

поправка

т.е. не понятно когда переменной присваивается значение, может по окончании выполнения всего запроса или может сначало использоваться в выражении, и только потом принимать новое значение
23 сен 16, 18:24    [19702053]     Ответить | Цитировать Сообщить модератору
 Re: Поведение переменной в update  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Остается непонятным, зачем пользоваться этим синтаксисом, а не написать просто:

update a set 
	f2 = v*f1,
	f3 = v * f1 * f1
from @t a
cross apply (
    select top 1 
        v = case when f1 < 5 then 1 else 0 end
) r
23 сен 16, 18:25    [19702059]     Ответить | Цитировать Сообщить модератору
 Re: Поведение переменной в update  [new]
@variablewithupdate
Guest
на самом деле так и есть,
не хотелось cross apply использовать, с переменной менее громоздко
кстати, а почему в селекте "top 1" ?
я без сарказма спрашиваю а серьезно
там вроде и так должна быть одна запись или это фича чтоб например оптимизатор правильно сработал?
23 сен 16, 18:36    [19702090]     Ответить | Цитировать Сообщить модератору
 Re: Поведение переменной в update  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
@variablewithupdate
на самом деле так и есть,
не хотелось cross apply использовать, с переменной менее громоздко
Зато более очевидно.

@variablewithupdate
кстати, а почему в селекте "top 1" ?
я без сарказма спрашиваю а серьезно
там вроде и так должна быть одна запись или это фича чтоб например оптимизатор правильно сработал?
Если мне не изменяет память, то ноги растут из оптимизатора. Но судя по тому, что с top и без него план одинаковый, я не уверен, что top как-то полезен.
23 сен 16, 18:58    [19702162]     Ответить | Цитировать Сообщить модератору
 Re: Поведение переменной в update  [new]
aleks2
Guest
Гавриленко Сергей Алексеевич
Остается непонятным, зачем пользоваться этим синтаксисом, а не написать просто:

update a set 
	f2 = v*f1,
	f3 = v * f1 * f1
from @t a
cross apply (
    select top 1 
        v = case when f1 < 5 then 1 else 0 end
) r


Осподе! Что это?!! Конкурс за самый дурацкий запрос?

update a set 
	f2 = v*f1,
	f3 = v * f1 * f1
from ( select *, v = case when f1 < 5 then 1 else 0 end from @t ) as a
23 сен 16, 19:07    [19702191]     Ответить | Цитировать Сообщить модератору
 Re: Поведение переменной в update  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
aleks2
Осподе! Что это?!! Конкурс за самый дурацкий запрос?

update a set 
	f2 = v*f1,
	f3 = v * f1 * f1
from ( select *, v = case when f1 < 5 then 1 else 0 end from @t ) as a
Не надо свое чувство прекрасного всем навязывать.
З.Ы. Когда 5 зависимых показателей надо рассчитывать, писать лапшу из подзапросов?
23 сен 16, 19:14    [19702221]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить