1
我想知道如何使用OUTPUT
来编写T-SQL DELETE
语句来为您已删除的行添加INSERT
语句(作为将来的回滚计划)而不是简单地输出被删除的行。SQL Server:带回滚INSERT语句的DELETE语句到文件中
通用示例或代码片段将被投票。
也包括声明作为一个整体将这些INSERT
语句导出到文件(例如使用BCP)将被接受为答案。
服务器是SQL Server的2008R2
谢谢
我想知道如何使用OUTPUT
来编写T-SQL DELETE
语句来为您已删除的行添加INSERT
语句(作为将来的回滚计划)而不是简单地输出被删除的行。SQL Server:带回滚INSERT语句的DELETE语句到文件中
通用示例或代码片段将被投票。
也包括声明作为一个整体将这些INSERT
语句导出到文件(例如使用BCP)将被接受为答案。
服务器是SQL Server的2008R2
谢谢
如果我理解你的问题,你想要的是创建一个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 ),当然你必须根据你的需要调整插入语句。
谢谢!如果没有临时表(即OUPUT INTO @tableVar),并且无需知道表结构(即在您的示例中,(id,value)和其余部分可以是自动生成的表),就可以使INSERT语句为泛型,那么任何机会都可以吗? – user1589188
@ user1589188我认为有可能使声明是通用的,但我也相信临时表是必要的,因为您需要一种方法来在删除会话和从外部运行的bcp会话之间持久保存数据。今天晚些时候我可以进一步研究。 – jpw
是的,通用的允许我在多个表格中使用它,而无需调整。不过,你的答案已经很聪明了。 – user1589188