无法理解此查询

时间:2016-03-24 08:08:31

标签: sql sql-server tsql variables sql-update

基本上我无法理解以下查询的作用:

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_qtybalanceso_docdt_id的每一行。

有人可以详细向我解释查询的含义:

UPDATE tbl SET @variable1 = columnA = expression

2 个答案:

答案 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)

它只是将值设置为变量并更新字段。