【问题标题】:SQL Server : DELETE statement with rollback INSERT statement into a fileSQL Server:带有回滚INSERT语句的DELETE语句到文件中
【发布时间】:2014-03-27 05:50:57
【问题描述】:

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

一个通用示例或代码 sn-p 将被投票。

将这些 INSERT 语句导出到文件中(例如使用 BCP)作为一个整体包含语句将被接受为答案。

服务器是 SQL Server 2008R2

谢谢

【问题讨论】:

    标签: sql sql-server-2008-r2


    【解决方案1】:

    如果我理解您的问题,您想要的是创建一个带有可撤消删除的插入语句的文件。如果是这样的话,应该可行的一种方法是:

    -- 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)并在不知道表结构的情况下使 INSERT 语句通用(即在您的示例中,(id,value),其余的可以是自动生成的)?跨度>
    • @user1589188 我认为可以使语句通用,但我也相信临时表是必要的,因为您需要一种方法来在删除会话和 bcp 会话之间保留数据从外面跑。我可以在今天晚些时候进一步调查。
    • 是的,请,一个通用的允许我在许多表中使用它而无需调整。不过,你的回答已经很聪明了。
    • @user1589188 我现在花了一些时间研究这个问题,虽然它当然可以以通用方式完成,但我相信这是一个相当复杂的过程,需要几个小时才能开始工作,而且我真的没有时间去做。我认为您最好的选择可能是查看这篇文章:stackoverflow.com/questions/7515110/… 或者查看如何使用 powershell 来使用“生成脚本”功能。
    • @user1589188 总而言之,这似乎需要大量工作。您可能需要考虑将已删除的记录插入到备份表中。这种方法可以很容易地恢复已删除的信息,并且创建这样的解决方案会容易得多。
    猜你喜欢
    • 2011-03-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2013-07-07
    • 1970-01-01
    相关资源
    最近更新 更多