2014-03-27 126 views
1

我想知道如何使用OUTPUT來編寫T-SQL DELETE語句來爲您已刪除的行添加INSERT語句(作爲將來的回滾計劃)而不是簡單地輸出被刪除的行。SQL Server:帶回滾INSERT語句的DELETE語句到文件中

通用示例或代碼片段將被投票。

也包括聲明作爲一個整體將這些INSERT語句導出到文件(例如使用BCP)將被接受爲答案。

服務器是SQL Server的2008R2

謝謝

回答

1

如果我理解你的問題,你想要的是創建一個INSERT語句,將撤消刪除文件。如果是這樣一個做到這一點,應該工作方式是這樣的:

-- set up some test data 
DECLARE @table1 TABLE (id INT, name VARCHAR(32)) 
INSERT INTO @table1 VALUES (1, 'Fred'),(2, 'Tom'),(3, 'Sally'),(4, 'Alice') 

-- drop and create a temporary table to hold the statements to output 
IF OBJECT_ID('TempOutputTable', 'U') IS NOT NULL 
DROP TABLE TempOutputTable 
CREATE TABLE TempOutputTable (SqlStatement VARCHAR(MAX)) 

-- delete a couple of rows from @table1 
DELETE FROM @table1 
OUTPUT 'INSERT table1 (id, value) VALUES (' + CAST(deleted.id AS VARCHAR(10)) + ', ''' + deleted.name + ''')' AS SqlStatement 
INTO TempOutputTable 
WHERE id = 4 OR id = 2 

-- export using bcp 
DECLARE @SqlCommand sysname 
SELECT @SqlCommand = 'bcp "select * from test.dbo.TempOutputTable" queryout D:\mytest.txt -c -T' 
EXEC xp_cmdshell @SqlCommand, NO_OUTPUT 

-- remove the temporary table 
DROP TABLE TempOutputTable 

後運行該文件D:\mytest.txt將包含此:

INSERT table1 (id, value) VALUES (2, 'Tom') 
INSERT table1 (id, value) VALUES (4, 'Alice') 

這假定xp_cmdshell啓用(以能夠運行BCP ),當然你必須根據你的需要調整插入語句。

+0

謝謝!如果沒有臨時表(即OUPUT INTO @tableVar),並且無需知道表結構(即在您的示例中,(id,value)和其餘部分可以是自動生成的表),就可以使INSERT語句爲泛型,那麼任何機會都可以嗎? – user1589188

+0

@ user1589188我認爲有可能使聲明是通用的,但我也相信臨時表是必要的,因爲您需要一種方法來在刪除會話和從外部運行的bcp會話之間持久保存數據。今天晚些時候我可以進一步研究。 – jpw

+0

是的,通用的允許我在多個表格中使用它,而無需調整。不過,你的答案已經很聰明瞭。 – user1589188