2009-01-21 67 views
34

當編寫破壞性查詢(例如,刪除或更新),在SQL Server Management Studio中我總是發現自己希望我可以預覽查詢的結果,而實際運行它。訪問很方便地讓你做到這一點,但我更喜歡代碼的手我的SQL其中,可悲的是,訪問是非常差。如何預覽破壞性SQL查詢?

所以我的問題是雙重的:

  1. 是否有SSMS的附加或單獨的工具,配有良好的SQL手工編碼設施,還可以預覽破壞性的查詢結果,類似於Access?

  2. 是否有「手」的任何技術或做預覽最佳做法;例如,以某種方式使用交易?

在我看來,這樣做這樣的事情根本是重要的,但還沒有我似乎無法找到通過谷歌任何東西(我可能只是在尋找錯誤的事情 - 我對這個可怕的無知物)。目前我正在一個相當毛茸茸帶和揹帶評論進出選擇/刪除/更新行,並確保我做備份的方法。肯定有更好的方法嗎?

任何人都可以幫忙嗎?

+0

http://stackoverflow.com/questions/281339/confirm-before-delete-update-in-sql-management -studio – Rockcoder 2009-01-21 12:30:38

回答

51

我會用現在的OUTPUT子句中SQL SERVER 2008年起...

OUTPUT Clause (Transact-SQL)

喜歡的東西...

BEGIN TRANSACTION 

DELETE [table] OUTPUT deleted.* WHERE [woof] 

ROLLBACK TRANSACTION 

INSERT和UPDATE可以使用 '插入' 表了。 MSDN文章涵蓋了這一切。

編輯:

這就像SELECT的其他建議則在事務內刪除,但它實際上兩者一起。所以你打開一個事務,刪除/插入/更新與OUTPUT子句,並同時輸出做了什麼的更改。然後你可以選擇回滾或提交。

+0

棒極了,這正是我所追求的。謝謝。 :) – 2009-01-21 14:35:34

+0

不客氣:) – MatBailie 2009-01-21 14:52:57

+0

我更喜歡凱文的解決方案,因爲您可以在不更改數據的情況下查看結果。選擇100000條記錄對於數據庫性能來說比刪除100000條記錄更好,輸出已刪除的結果然後回滾。 – HLGEM 2009-01-21 19:15:49

2

當你在交易的情況下,你可以回滾更改事務被提交之前的任何時間。 (無論是通過調用明確承諾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 
22

我生活在恐懼中有人這樣對我的數據庫,所以我總是問我的團隊做類似如下:

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和整個刪除語句並運行它。如果刪除預期的相同數量的記錄,請突出顯示COMMIT TRAN並運行它。如果任何東西看起來不可思議,請突出顯示ROLLBACK TRAN並運行它。

我使用任何UPDATE或DELETE語句執行此操作。它爲我節省了幾次,但總是讓人安心。

1

當我想查看將要刪除的內容時,只需將「刪除」語句更改爲「select *」即可。我喜歡這個比使用交易更好,因爲我不必擔心鎖定。

4

當刪除:

BEGIN TRANSACTION 

    DELETE FROM table1 
    OUTPUT deleted.* 
    WHERE property1 = 99 

ROLLBACK TRANSACTION 

當更新/插入:

BEGIN TRANSACTION 

    UPDATE table1 
    SET table1.property1 = 99 
    OUTPUT inserted.* 

ROLLBACK TRANSACTION