在SQL Server Management Studio中编写破坏性查询(例如,DELETE或UPDATE)时,我总是发现自己希望能够在不实际运行查询结果的情况下预览查询结果。访问非常方便,允许你这样做,但我更喜欢手工编写我的SQL,遗憾的是,Access非常差。
所以我的问题有两个:
是否有SSMS的附加组件,或者是一个单独的工具,它配备了良好的SQL手工编码工具,也可以预览破坏性查询的结果,类似于Access?
是否有任何“手工”预览的技巧或最佳做法;例如,以某种方式使用交易?
在我看来,做这类事情从根本上讲很重要,但我似乎无法通过谷歌找到任何东西(我可能只是在寻找错误的东西 - 我对此事非常无知)。目前我采取了一种相当毛茸茸的腰带和括号方法来评论进出选择/删除/更新行并确保我做备份。肯定会有更好的方法吗?
有人可以帮忙吗?
答案 0 :(得分:52)
我会使用SQL SERVER 2008中的OUTPUT子句......
像...一样的东西。
BEGIN TRANSACTION
DELETE [table] OUTPUT deleted.* WHERE [woof]
ROLLBACK TRANSACTION
INSERT和UPDATE也可以使用'inserted'表。 MSDN文章涵盖了所有内容。
修改强>
这就像SELECT中的其他建议然后DELETE在一个事务中,除了它实际上两者一起。因此,您打开一个事务,使用OUTPUT子句删除/插入/更新,并在ALSO输出已完成的操作时进行更改。然后您可以选择回滚或提交。
答案 1 :(得分:24)
我害怕有人这样做到我的数据库,所以我总是要求我的团队做以下事情:
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语句执行此操作。它救了我几次,但它总是让人高枕无忧。
答案 2 :(得分:6)
删除时:
BEGIN TRANSACTION
DELETE FROM table1
OUTPUT deleted.*
WHERE property1 = 99
ROLLBACK TRANSACTION
更新/插入时:
BEGIN TRANSACTION
UPDATE table1
SET table1.property1 = 99
OUTPUT inserted.*
ROLLBACK TRANSACTION
答案 3 :(得分:2)
当您处于事务的上下文中时,您可以在提交事务之前随时回滚更改。 (通过显式调用commit tran或者如果出现会导致服务器隐式提交事务的条件)
create table x (id int, val varchar(10))
insert into x values (1,'xxx')
begin tran
delete from x
select * from x
rollback tran
select * from x
答案 4 :(得分:1)
当我想查看将要删除的内容时,我只需将“删除”语句更改为“select *”。我比使用交易更喜欢这个,因为我不必担心锁定。