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

时间:2010-11-15 14:16:37

标签: sql-server sql-server-2008 sql

前几天我正在阅读一篇文章,展示了如何将SQL Update,Insert或Deletes作为whatif类型场景运行。我不记得他们谈到的参数,现在我找不到文章。不确定我是不是在做梦。

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

6 个答案:

答案 0 :(得分:3)

我不知道任何支持事务的SQL服务的SQL2008特定功能,你可以这样做:

  1. 开始交易(TSQL中的“BEGIN TRANSACTION”)
  2. 其余的INSERT / UPDATE / DELETE /任何代码
  3. (可选)一些额外的SELECT语句,如果需要输出上述操作的结果,如果步骤2的默认输出(例如“X行受影响”)不够,
  4. 回滚事务(TSQL中的“ROLLBACK TRANSACTION”)
  5. (可选)重复测试代码,以显示第2步中没有运行代码的情况。
  6. 例如:

    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
    

    (您可能更愿意在开始交易之前执行可选的“确认”步骤,而不是在回滚之后,但我总是这样做,因为它保留了两个可能相同的部分编码一起以便于编辑)

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

答案 1 :(得分:2)

好的,终于明白了。我把这与我正在使用PowerShell的另一个项目混淆了。 PowerShell有一个“whatif”参数,可用于向您显示在删除文件之前将删除哪些文件。

我向那些花时间寻找这个港口答案的人表示歉意,并感谢那些做出回应的人。

答案 2 :(得分:1)

我相信你在谈论BEGIN TRANSACTION

  

BEGIN TRANSACTION为发出语句的连接启动本地事务。根据当前事务隔离级别设置,为支持连接发出的Transact-SQL语句而获取的许多资源将被事务锁定,直到使用COMMIT TRANSACTION或ROLLBACK TRANSACTION语句完成。长时间未完成的事务可以阻止其他用户访问这些锁定的资源,也可以防止日志截断。

答案 3 :(得分:0)

你的意思是SET NOEXEC ON吗?

  

当SET NOEXEC为ON时,SQL Server   编译每批Transact-SQL   语句但不执行它们。   当SET NOEXEC为OFF时,所有批次   在编译后执行。

请注意,这不会警告/指示密钥违规等事项。

答案 4 :(得分:0)

Toad for SQL Server具有“验证SQL ”功能,可根据错误的表/列名称等检查查询。也许你在谈论SSMS 2008中的一些新功能,类似于......

答案 5 :(得分:0)

这个特定的派对迟到了七年多,但我怀疑有问题的特征也可能是OUTPUT条款。当然,它可以用于在t-sql存储过程中实现类似于Powershell的whatif功能。

https://docs.microsoft.com/en-us/sql/t-sql/queries/output-clause-transact-sql

在每个插入/更新/删除/合并查询中使用此选项,让SP输出其所做更改的有意义的结果集,例如输出表名和作为前两列执行的操作,然后输出所有更改的列。

如果@whatif参数设置为1,则简单地回滚更改,或者如果@whatif设置为0,则提交它们。