安全地将行数据从一个表插入另一个表 - SQL

时间:2011-06-30 09:03:25

标签: sql performance sql-server-2005 transactions

我需要使用脚本将存储在一个表中的一些数据移动到另一个表中,同时考虑可能已存在于目标表中的现有记录以及可能存在的任何关系。

我很想知道这样做的最佳方法对性能影响相对较小,如有必要可以撤销。

首先,我将只移动一条记录以确保流程顺利运行,但随后它将负责移动大约1650行。

最好的方法是什么?还是有更好的选择?

编辑:

我之前使用MERGE的建议不起作用,因为我将在SQL Server 2005环境下运行,而不像之前提到的那样在2008年运行。

2 个答案:

答案 0 :(得分:2)

这个问题没有提供任何细节,所以我不能提供任何实际真正的代码,只是这个攻击计划:

第1步编写一个只会选择需要复制的行的查询。您需要JOIN和/或过滤(WHERE)此数据才能包含目标表中尚不存在的行。使列列表与目标表的列完全相同,按列顺序和数据类型。

第2步通过在select之前添加INSERT YourDestinationTable (col1, col2, col3..)将SELECT语句转换为INSERT。

第3步如果您只想尝试单行,请在新TOP 1的选择部分添加INSERET - SELECT command,您可以多次重新运行此命令必要时使用/不使用TOP,因为它应该消除您在JOIN

中的WHERESELECT条件添加的任何行

最后,你会看到一些东西:

INSERT YourDestinationTable
        (Col1, Col2, Col3, ...)
    SELECT
        s.Col1, s.Col2, s.Col3, ...
        FROM YourSourceTable                s
            LEFT OUTER JOIN SomeOtherTable  x ON s.Col4=x.Col4
        WHERE NOT EXISTS (SELECT 1 FROM YourDestinationTable d WHERE s.PK=d.PK)
            AND x.Col5='J'

我正在阅读这个问题,因为只是将源表中缺少的行插入到目标表中。如果需要迁移更改,那么在上述步骤之前,您需要在源表中加入目标表的UPDATE。如果没有实际表格,列等的具体细节,这很难解释。

答案 1 :(得分:1)

是的,如果您运行SQL Server 2008,则MERGE语句非常适合批量导入。