2014-03-27 53 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