曾经,我需要对从表中的select返回的所有外键值执行复杂的修改(使用给定的外键更新所有行,并插入具有相同外键和一些新值的新行),其中这些值是主键。
这是一个“只做一次”的情况,不用于编码。
因此,我编写了以下脚本:使用update和insert声明一个存储过程,在select上声明一个快进光标,然后对获取的每个ID执行该过程,最后删除该过程。但是,我几乎可以肯定,还有更好的方法。
如果再次发生这种情况,您会提出什么建议?
P.S。 MS SQL Server 2005。
P.P.S。更新和选择处于这样的关系中,即满足选择条件的行在更新后不再满足那些条件。
UPD:
例如:
将要修改的表UserLog(混淆实际的列名和值):
[…,user_Id:25,日期:01.01.1654,check_life_signs:0],
[…,user_Id:47,日期:05.05.1717,check_life_signs:0],
[…,user_Id:25,日期:01.01.998,check_life_signs:1],
[…,user_Id:54,日期:2019年12月10日,check_life_signs:0],
…
需要:
1. Select distinct Id from User join UserLog on User.Id = UserLog.user_Id
where User.IsVampire = 1 and UserLog.check_life_signs = 0 and UserLog.date <
(some date given)
2. For all such Id: UPDATE UserLog Set check_life_signs = 1; INSERT INTO
UserLog (user_Id, date, check_life_signs) VALUES (id found), GETDATE(), 0
因此,在此过程之后,如果user_Id = 54不是吸血鬼,则表UserLog将变为:
[…,user_Id:25,日期:01.01.1654,check_life_signs:1],
[…,user_Id:47,日期:05.05.1717,check_life_signs:1],
[…,user_Id:25,日期:01.01.998,check_life_signs:1],
[…,user_Id:54,日期:2019年12月10日,check_life_signs:0],
[…,user_Id:25,日期:12.10.2019,check_life_signs:0],
[…,user_Id:47,日期:12.10.2019,check_life_signs:0],
…
尝试在下面的查询中获得预期的结果-
第1步-在临时表中选择并存储ID,该表需要用于更新和插入用户日志表] >>
select * into #tempUser From (Select distinct id from [User] inner join UserLog on [User].Id = UserLog.user_Id where [User].IsVampire = 1 and UserLog.check_life_signs = 0 and UserLog.date < getdate()) a
步骤2-更新UserLog表
Update UserLog Set check_life_signs = 1 From UserLog ul inner join #tempUser on ul.user_Id = #tempUser.Id;
步骤3-插入到UserLog表中
INSERT INTO UserLog (user_Id, date, check_life_signs) Select id, GETDATE(), 0 from #tempUser;
步骤4-删除温度表
Drop table #tempUser