如何在 SQL 中同时发送带有语句的更新批处理
How to send update batch with statements simultaneously in SQL
BEGIN TRANSACTION
UPDATE table_x
SET Part = 8
WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'X'
UPDATE table_x
SET Part = 0
WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'Y'
UPDATE table_x
SET Part = 2
WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'Z'
COMMIT TRANSACTION
基本上我们有三行,它们的总和必须为 10(如您现在所见,它是 8+0+2 = 10)。我有一个检查触发器,因此在更新或插入新值时该值始终应为 10,但就目前而言,它无法更新,因为它发送第一个 UPDATE "WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'X' " 进行检查,并且总和将在大多数情况下案例不会通过,因为它会多于或少于 10 个。
我想要的是同时发送所有这些更新,以便值一起更改。有什么办法可以实现吗?
这是你想做的吗:
UPDATE table_x
SET Part = CASE WHEN Code = 'X' THEN 8
WHEN Code = 'Y' THEN 0
WHEN Code = 'Z' THEN 2
END
WHERE A = 2 AND B = 2 AND C = 1 AND Code IN ('X','Y','Z')
SQL服务器实际上在触发方面更智能一些,所以一个语句应该有效:
UPDATE table_x
SET Part = (CASE Code WHEN 'X' THEN 8 WHEN 'Y' THEN 0 ELSE 2 END)
WHERE A = 2 AND B = 2 AND C = 1 AND Code IN ('X', 'Y', 'Z');
触发器本身必须非常智能地检查 inserted
值而不是 table 中的值,但这是可行的。
或者(在某些情况下可能是更好的解决方案)是 disable 触发更新。这样做的好处是触发代码不需要更改。
BEGIN TRANSACTION
UPDATE table_x
SET Part = 8
WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'X'
UPDATE table_x
SET Part = 0
WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'Y'
UPDATE table_x
SET Part = 2
WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'Z'
COMMIT TRANSACTION
基本上我们有三行,它们的总和必须为 10(如您现在所见,它是 8+0+2 = 10)。我有一个检查触发器,因此在更新或插入新值时该值始终应为 10,但就目前而言,它无法更新,因为它发送第一个 UPDATE "WHERE A = 2 AND B = 2 AND C = 1 AND Code = 'X' " 进行检查,并且总和将在大多数情况下案例不会通过,因为它会多于或少于 10 个。
我想要的是同时发送所有这些更新,以便值一起更改。有什么办法可以实现吗?
这是你想做的吗:
UPDATE table_x
SET Part = CASE WHEN Code = 'X' THEN 8
WHEN Code = 'Y' THEN 0
WHEN Code = 'Z' THEN 2
END
WHERE A = 2 AND B = 2 AND C = 1 AND Code IN ('X','Y','Z')
SQL服务器实际上在触发方面更智能一些,所以一个语句应该有效:
UPDATE table_x
SET Part = (CASE Code WHEN 'X' THEN 8 WHEN 'Y' THEN 0 ELSE 2 END)
WHERE A = 2 AND B = 2 AND C = 1 AND Code IN ('X', 'Y', 'Z');
触发器本身必须非常智能地检查 inserted
值而不是 table 中的值,但这是可行的。
或者(在某些情况下可能是更好的解决方案)是 disable 触发更新。这样做的好处是触发代码不需要更改。