前几天我正在阅读一篇文章,展示了如何将SQL Update,Insert或Deletes作为whatif类型场景运行。我不记得他们谈到的参数,现在我找不到文章。不确定我是不是在做梦。
无论如何,有没有人知道SQL2008中是否有一个参数可以让你尝试插入,更新或删除而不实际提交它?它实际上会记录或显示它将更新的内容。如果参数符合您的预期,则删除参数并运行它。
答案 0 :(得分:3)
我不知道任何支持事务的SQL服务的SQL2008特定功能,你可以这样做:
例如:
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,则提交它们。