【问题标题】:Bulk Copying and Deleting in OneTransactionOneTransaction 中的批量复制和删除
【发布时间】:2009-06-01 09:58:35
【问题描述】:

在 C# 应用程序中,我喜欢将表数据从一台服务器 (SQLServer2000) 复制到另一台服务器 (SQLServer2005)。我喜欢复制单个实例中的数据并删除 SQL Server 2000 表中的现有数据。我需要在单个事务中完成所有这些(批量复制和删除)。如何做到这一点?

注意:我有两个不同的 sql server 连接,如何为单个事务实现此功能

【问题讨论】:

    标签: c# sql-server ado.net


    【解决方案1】:

    为了最小化事务的持续时间,我总是通过批量复制到一个 staging 表(相同的架构,但不同的名称 - 没有索引等),然后一旦所有数据都在服务器上,执行以下操作:

    BEGIN TRAN
    
    DELETE FROM FOO
    
    INSERT FOO ...
    SELECT ...
    FROM FOO_STAGING
    
    COMMIT TRAN
    
    DELETE FROM FOO_STAGING
    

    (事务可以在 TSQL 中或通过托管代码或通过TransactionScope 的连接上;TSQL 可以作为命令文本或作为 SPROC)

    【讨论】:

    • 请注意,此解决方案以事务方式为您提供快照,但不会将读取保持在同一事务中。这对所有用户来说几乎可以肯定是好的,值得大的性能优势,但值得注意。使用带有快照版本控制的数据库应该可以消除简单天真的解决方案的问题
    【解决方案2】:

    您可以使用linked servers 执行此操作,尽管我从未尝试在 SQL2005 和 SQL2000 实例之间执行此操作。在您的 SQL2005 实例上:

    sp_addlinkedserver Sql2000Server --Only need to do this once on the server
    
    BEGIN TRAN
    
    INSERT INTO dbo.MyTable (id, column) 
        SELECT id, column FROM Sql2000Server.MyDatabase.dbo.MyTable
    DELETE FROM Sql2000Server.MyDatabase.dbo.MyTable
    --etc...
    
    COMMIT TRAN
    

    有关添加/删除链接服务器的语法,请参阅 Microsoft 在线书籍 (http://msdn.microsoft.com/en-us/library/ms190479.aspx)

    【讨论】:

      【解决方案3】:

      除了链接服务器的建议,您也可以使用 SSIS,这将是我的首选方法。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多