首页 > 解决方案 > 更新 SQL Server 查询循环,直到达到 X 数

问题描述

我需要同时更新数据库中的几行。现在的问题是我只会知道第一行的唯一 ID,但之后我会有 X 个其他行,这些行也需要使用一些数据进行更新。我会知道我需要多少个循环来更新它们——只需要知道如何去做。

我的查询如下所示:

UPDATE bLine 
SET @val1 
WHERE theGuid = @val2;

现在@val1 的数据如下所示:

ID | qty_SerialNum | qty_Location | qty_Property | theGUID 
---+---------------+--------------+--------------+---------------------------
5  | 6845fg56      | Home         | NA           | a45vz-u300-2bd-4710j-vf09
6  | fk469fkh      | Dock#4       | NA           |
7  | geww2         | Dock#1       | Local        |
...

当在一个字符串中发送给@val1时:

@val1 = qty_SerialNum = '6845fg56,fk469fkh,geww2',
        qty_Location = 'Home,Dock#4,Dock#1',
        qty_Property = 'NA,NA,Local' 
@val2 = theGUID = 'a45vz-u300-2bd-4710j-vf09'

所以这一切都很好,因为我知道需要更新的第一行的GUID ,但之后的每一行都不知道

所以第一次更新看起来像 3 个:

UPDATE
   bLine
SET
   (qty_SerialNum = '6845fg56',qty_Location = 'Home',qty_Property = 'NA' )
WHERE 
   theGuid = 'a45vz-u300-2bd-4710j-vf09';

这将是 3 次更新中的第 2 次:

UPDATE
   bLine
SET
   (qty_SerialNum = 'fk469fkh',qty_Location = 'Dock#4',qty_Property = 'NA' )
WHERE 
   ???? = ????;

最后,这将是 3 次更新中的第 3 次:

UPDATE
   bLine
SET
   (qty_SerialNum = 'geww2',qty_Location = 'Dock#1',qty_Property = 'Local' )
WHERE 
   ???? = ????;

所以这里的问题是 - 我如何遍历接下来的 X 行并使用 @val1 中的 2,3,... 值更新该信息(跳过第一个,因为它已经通过 theGUID 保存)?

标签: c#sqlsql-serversql-server-2016

解决方案


你有一个非常神秘的问题。通常,SQL 更新不适用于这种方式的“相邻”行。但是,您可以通过将值存储在(虚拟)表中并将两侧连接在一起来使其工作:

with v as (
      select v.*
      from (values (1, '6845fg56', 'Home', 'NA'),
                   (2, 'fk469fkh', 'Dock#4', 'NA'),
                   (3, 'geww2', 'Dock#1', 'Local')
           ) v(seqnum, qty_SerialNum, qty_Location, qty_Property)
     )
update b
   set qty_SerialNum = v.qty_SerialNum,
       qty_Location = v.qty_Location,
       qty_Property = v.qty_Property
    from (select top(3) b.*,
                 row_number() over (order by id) as seqnum
          from bline b
          where id >= (select id from bline where theGUID = 'a45vz-u300-2bd-4710j-vf09'
          order by id
         ) b join
         v
         on b.seqnum = v.seqnum;

推荐阅读