c# - 更新 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 保存)?
解决方案
你有一个非常神秘的问题。通常,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;
推荐阅读
- android - 过滤从 REST 获取的数据的正确方法是什么?
- actions-on-google - 绕过欢迎消息的显式调用
- xml - XPATH:解析 XML 需要兄弟的孩子等等
- javascript - vuex 必须在创建 store 实例之前调用 Vue.use(Vuex)
- php - 替换不推荐使用的函数会破坏代码
- python - 如何将此for循环转换为dict理解?
- ocaml - 将字符串拆分成块
- html - 如何使用 CSS 绘制水滴状的形状?
- bash - awk 正则表达式 while 循环
- python - 如何在 subprocess.check_call() 中传递多个参数?