在 SQL 服务器中组合多个更新语句
Combining mupltiple update statements in SQL Server
我有一个场景,我正在通过以下方式更新大约 40000 个工人记录:
- 我必须先更新角色 ID 为 1 的工作人员。
- 然后剩下的role-id 为2,0,3 的仅用于上次更新中未更新的角色。
我的问题:有什么方法可以将所有 4 个合并到一个更新语句中吗?
我担心的是我的生产服务器非常强大,有多个处理器,并且可能会在我一次又一次地更新相同的 table 时陷入僵局。我们在其他地方遇到过这个问题,我们不得不替换用户定义的函数。
这里是示例更新脚本:
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE B.CD_ROLE = 1
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
AND B.CD_ROLE = 2
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
AND B.CD_ROLE = 0
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
AND B.CD_ROLE = 3
您似乎正在使用 SQL 服务器。如果是这样,apply
可以提供帮助:
UPDATE fr
SET Start_Office = sd.TX_LCTN,
Start_Worker_ID = sd.wrkr_id_prsn
FROM #FinalRes fr APPLY
(SELECT TOP 1 sd.*
FROM #StartData sd
WHERE sd.ID_CASE = fr.ID_CASE AND
sd.Case_Open_Date = fr.Case_Open_Date
ORDER BY sd.CD_ROLE
) sd
我有一个场景,我正在通过以下方式更新大约 40000 个工人记录:
- 我必须先更新角色 ID 为 1 的工作人员。
- 然后剩下的role-id 为2,0,3 的仅用于上次更新中未更新的角色。
我的问题:有什么方法可以将所有 4 个合并到一个更新语句中吗?
我担心的是我的生产服务器非常强大,有多个处理器,并且可能会在我一次又一次地更新相同的 table 时陷入僵局。我们在其他地方遇到过这个问题,我们不得不替换用户定义的函数。
这里是示例更新脚本:
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE B.CD_ROLE = 1
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
AND B.CD_ROLE = 2
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
AND B.CD_ROLE = 0
UPDATE A
SET Start_Office = B.TX_LCTN,
Start_Worker_ID = B.wrkr_id_prsn
FROM #FinalRes A
INNER JOIN #StartData B ON A.ID_CASE = B.ID_CASE
AND A.Case_Open_Date = B.Case_Open_Date
WHERE A.Start_Worker_ID IS NULL
AND B.CD_ROLE = 3
您似乎正在使用 SQL 服务器。如果是这样,apply
可以提供帮助:
UPDATE fr
SET Start_Office = sd.TX_LCTN,
Start_Worker_ID = sd.wrkr_id_prsn
FROM #FinalRes fr APPLY
(SELECT TOP 1 sd.*
FROM #StartData sd
WHERE sd.ID_CASE = fr.ID_CASE AND
sd.Case_Open_Date = fr.Case_Open_Date
ORDER BY sd.CD_ROLE
) sd