在SQL Server Management Studio中编写破坏性查询(例如,DELETE或UPDATE)时,我总是发现自己希望能够在不实际运行查询结果的情况下预览查询结果.访问非常方便允许你这样做,但我更喜欢手工编写我的SQL,遗憾的是,Access非常差.
所以我的问题是双重的:
是否有SSMS的附加组件,或者是一个单独的工具,它配备了良好的SQL手工编码工具,也可以预览破坏性查询的结果,类似于Access?
是否有任何技术或最佳做法"手工"进行预览; 例如,以某种方式使用交易?
在我看来,做这种事情从根本上讲是重要的,但我似乎无法通过谷歌找到任何东西(我可能只是在寻找错误的东西 - 我对这件事非常无知).目前我采取了一种相当毛茸茸的腰带和括号方法来评论进出选择/删除/更新行并确保我做备份.肯定有必要有更好的方法吗?
有人可以帮忙吗?
我将使用SQL SERVER 2008中的OUTPUT子句...
OUTPUT子句(Transact-SQL)
就像是...
BEGIN TRANSACTION DELETE [table] OUTPUT deleted.* WHERE [woof] ROLLBACK TRANSACTION
INSERT和UPDATE也可以使用'inserted'表.MSDN文章涵盖了所有内容.
编辑:
这就像SELECT中的其他建议然后在事务中删除,除了它实际上两者一起.因此,您打开一个事务,使用OUTPUT子句删除/插入/更新,并在ALSO输出已完成的操作时进行更改.然后您可以选择回滚或提交.
我生活在害怕有人这样做到我的数据库,所以我总是要求我的团队做类似以下的事情:
BEGIN TRAN DELETE FROM X -- SELECT * FROM X FROM Table A as X JOIN Table B ON Blah blah blah WHERE blah blah blah ROLLBACK TRAN COMMIT TRAN
这样,如果你不小心碰到F5(做完了!),你就不会做任何改动.您可以在SQL语句的末尾突出显示SELECT部分,以查看将更改哪些记录(以及有多少记录).然后,突出显示BEGIN TRAN和整个Delete语句并运行它.如果删除了预期的相同数量的记录,请突出显示COMMIT TRAN并运行它.如果看起来很糟糕,请突出显示ROLLBACK TRAN并运行它.
我使用任何UPDATE或DELETE语句执行此操作.它救了我几次,但它总是让人高枕无忧.
删除时:
BEGIN TRANSACTION DELETE FROM table1 OUTPUT deleted.* WHERE property1 = 99 ROLLBACK TRANSACTION
更新/插入时:
BEGIN TRANSACTION UPDATE table1 SET table1.property1 = 99 OUTPUT inserted.* ROLLBACK TRANSACTION