SQL Server:带有回滚INSERT语句的DELETE语句到文件中

时间:2014-03-27 05:50:57

标签: sql sql-server-2008-r2

我想知道你如何使用DELETE编写一个T-SQL OUTPUT语句来为你删除的那些行吐出INSERT语句(作为将来的回滚计划)而不是简单地输出被删除的行。

通用示例或代码段将被投票。

将包含此语句(例如使用BCP)的INSERT语句整体包含在语句中作为答案。

服务器是SQL Server 2008R2

谢谢

1 个答案:

答案 0 :(得分: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),当然您必须根据需要调整insert语句。