【发布时间】:2014-03-27 05:50:57
【问题描述】:
我想知道如何使用 OUTPUT 编写 T-SQL DELETE 语句来为您已删除的那些行(作为将来的回滚计划)吐出 INSERT 语句,而不仅仅是简单地输出被删除的行。
一个通用示例或代码 sn-p 将被投票。
将这些 INSERT 语句导出到文件中(例如使用 BCP)作为一个整体包含语句将被接受为答案。
服务器是 SQL Server 2008R2
谢谢
【问题讨论】:
我想知道如何使用 OUTPUT 编写 T-SQL DELETE 语句来为您已删除的那些行(作为将来的回滚计划)吐出 INSERT 语句,而不仅仅是简单地输出被删除的行。
一个通用示例或代码 sn-p 将被投票。
将这些 INSERT 语句导出到文件中(例如使用 BCP)作为一个整体包含语句将被接受为答案。
服务器是 SQL Server 2008R2
谢谢
【问题讨论】:
如果我理解您的问题,您想要的是创建一个带有可撤消删除的插入语句的文件。如果是这样的话,应该可行的一种方法是:
-- 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),当然您必须根据需要调整插入语句。
【讨论】: