Не удалось понять этот запрос

78
6

В принципе, я не понимаю, что делает этот запрос ниже:

UPDATE @so_stockmove 
SET @total_move_qty = total_move_qty = (
CASE WHEN @so_docdt_id <> so_docdt_id THEN 0
ELSE ISNULL(@total_move_qty, 0)
END
) + ISNULL(move_qty,0),
balance = so_qty - @total_move_qty,
@so_docdt_id = so_docdt_id

Я могу только предположить, что он обновляет каждую строку для столбцов total_move_qty, balance, so_docdt_id.

Может кто-нибудь объяснить мне подробно, что означает запрос:

UPDATE tbl SET @variable1 = columnA = expression

спросил(а) 2021-01-19T18:22:15+03:00 8 месяцев назад
1
Решение
78

Обновить
Прочитав комментарии @MotoGP, я немного поработал и нашел эту статью Джеффом Моденом, где он утверждает следующее:

Предупреждение:
Ну, вроде. Многие люди (включая некоторые из "больших" имен в мире SQL) предостерегают от и, иногда, прямо осуждают метод, содержащийся в этой статье, как "ненадежный" и "неподдерживаемый". Один из MVP даже назвал его "недокументированным взломом" на довольно недавнем "24 часах SQL". Даже самое ядро метода, возможность обновления переменной из строки в строку, было проклято аналогичным образом. Хуже того, за исключением возможности делать 3 обновления частей (SET @variable = columnname = expression) и одновременно обновлять как переменные, так и столбцы, нет абсолютно никакой документации Microsoft для поддержки использования этого метода каким-либо образом, формы или формы. На самом деле даже Microsoft заявила, что нет никакой гарантии, что этот метод будет работать правильно все время.

Теперь позвольте мне сказать вам, что, кроме одного, что ВСЕ истинно. Единственное, что не соответствует действительности, это его ненадежность. Эта часть цели статьи... чтобы доказать ее надежность (что действительно невозможно сделать, если вы ее не используете, как будто это доказывает надежность оператора SELECT). В конце статьи, сделайте свой собственный разум. Если вы решите, что не хотите использовать такую очень старую, но недокументированную функцию, используйте цикл Cursor или While или, возможно, даже CLR, потому что все остальные методы слишком медленны. Хе-хе... просто перестань говорить мне, что это недокументированный хак... Я уже знаю это и сейчас, так и есть. ;-)

Первое издание

Ну, этот запрос обновляет столбцы total_move_qty и balance в переменной таблицы, называемой @so_stockmove, и в то же время устанавливает значения для переменных, называемых @total_move_qty и @so_docdt_id.

Я не знал, что возможно присвоить значения более чем одной цели таким образом на сервере Sql (@variable1 = columnA = expression), но, по-видимому, это возможно.

Вот мой тест:

declare @bla char(1)

declare @tbl table
(
X char(1)
)

insert into @tbl VALUES ('A'),('B'), ('C')

SELECT *
FROM @tbl

UPDATE @tbl
SET @Bla = X = 'D'

SELECT *
FROM @tbl

SELECT @bla

Результаты:

X -- first select before update
----
A
B
C

X -- second select after update
----
D
D
D

---- select the variable value after update
D

ответил(а) 2021-01-19T18:22:15+03:00 8 месяцев назад
46

Он просто устанавливает значение переменной и обновляет поле.

ответил(а) 2021-01-19T18:22:15+03:00 8 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема