SQL - 更新、删除、插入 - Whatif 场景

Ice*_*man 1 sql sql-server sql-server-2008

前几天我读了一篇文章,展示了如何在假设类型场景中运行 SQL 更新、插入或删除。我不记得他们谈到的参数,现在我找不到这篇文章。不确定我是否在做梦。

无论如何,有谁知道 SQL2008 中是否有一个参数可以让您尝试插入、更新或删除而不实际提交它?它实际上会记录或显示它会更新什么。如果它的行为符合您的预期,您可以删除该参数并运行它。

Dav*_*ett 5

我不知道任何支持事务的 SQL 服务的 SQL2008 特定功能,您可以执行以下操作:

  1. 启动事务(TSQL 中的“BEGIN TRANSACTION”)
  2. 其余的插入/更新/删除/任何代码
  3. (可选)如果步骤 2 的默认输出(例如“受影响的 X 行”)不够,则需要一些额外的 SELECT 语句等来输出上述操作的结果
  4. 回滚事务(TSQL 中的“ROLLBACK TRANSACTION”)
  5. (可选)重复测试代码以显示在步骤 2 中的代码未运行的情况下情况如何

例如:

BEGIN TRANSACTION
-- make changes
DELETE people WHERE name LIKE 'X%'
DELETE people WHERE name LIKE 'D%'
EXEC some_proc_that_does_more_work
-- check the DB state after the changes
SELECT COUNT(*) FROM people
-- undo
ROLLBACK TRANSACTION
-- confirm the DB state without the changes
SELECT COUNT(*) FROM people
Run Code Online (Sandbox Code Playgroud)

(您可能更喜欢在开始事务之前而不是在回滚事务之后执行可选的“确认”步骤,但我总是这样做,因为它将两个可能相同的代码部分保留在一起更容易编辑)

如果您使用类似的东西而不是 SQL2008 特定的东西,那么该技术也应该可以转移到其他 RDBS(如果需要,只需更新语法)。