基本上我无法理解以下查询的作用:
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
答案 0 :(得分:2)
<强>更新强>
在阅读@MotoGP评论后,我做了一些挖掘,并在this article找到了Jeff Moden,其中说明了以下内容:
警告:强>
好吧,有点。许多人(包括SQL世界中的一些&#34;大&#34;名称)发出警告,有时甚至完全谴责 本文中包含的方法为&#34;不可靠&#34; &安培; &#34;不支持&#34 ;.一 其他MVP甚至称它为&#34;无证件的黑客&#34;在最近的 &#34; 24小时的SQL&#34;。即使是方法的核心,也是能力 从一行到另一行更新一个变量,已经被诅咒了一个类似的 时尚。更糟糕的是,除了能够进行3部分更新(SET @variable = columnname = expression)并更新两个变量和 在列的同时,绝对没有微软 支持以任何方式,形状或方式使用此方法的文档 形成。事实上,即便是微软也表示没有保证 这个方法一直都能正常工作。现在,让我告诉你,除了一件事,这一切都是真的。该 有一件事是不正确的是它所谓的不可靠性。那是其中的一部分 文章的目标......证明其可靠性(真的 除非您使用它,否则无法完成。这就像证明了它的可靠性 SELECT语句)。在文章的最后,组成自己的 心神。如果你决定不想使用这么老的, 未记录的功能,然后使用Cursor或While循环,甚至可能使用 CLR,因为所有其他方法都太慢了。嘿... 停止告诉我这是一个没有证件的黑客......我已经知道了 那个,现在,你也是。 ; - )
第一版
好吧,此查询更新名为total_move_qty
的表变量中的列balance
和@so_stockmove
,同时将值设置为名为@total_move_qty
和{{的变量1}}。
我不知道可以在Sql server(@so_docdt_id
)中以这种方式为多个目标分配值,但显然这是可能的。
这是我的测试:
@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
答案 1 :(得分:0)
它只是将值设置为变量并更新字段。