如何在SQL中同时发送带有语句的更新批处理

时间:2016-01-19 17:09:25

标签: sql sql-server triggers sql-server-2014

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。

我想要的是同时发送所有这些更新,以便值一起变化。有没有办法让这种情况发生?

2 个答案:

答案 0 :(得分:1)

这就是你想要做的事情:

 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')

答案 1 :(得分:1)

SQL Server实际上对触发更加智能,因此一个语句应该可以工作:

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值而不是表中的值,但这是可行的。

或者(在某些情况下可能是更好的解决方案)是disable更新的触发器。这样做的好处是触发代码不需要改变。