【问题标题】:Safely insert row data from one table to another - SQL安全地将行数据从一个表插入到另一个表 - SQL
【发布时间】:2011-06-30 09:03:24
【问题描述】:

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

我很想知道执行此操作的最佳方法,它对性能的影响相对较小,并且可以在必要时逆转。

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

最好的方法是什么,或者有更好的选择吗?

编辑:

我之前使用 MERGE 的建议不会奏效,因为我将在 SQL Server 2005 环境下运行,而不是前面提到的 2008 环境。

【问题讨论】:

    标签: sql performance sql-server-2005 transactions


    【解决方案1】:

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

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

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

    第 3 步如果您只想尝试单行,请将 TOP 1 添加到新 INSERET - SELECT command 的选择部分,您可以根据需要多次重新运行此命令 /没有TOP,因为它应该消除您通过JOINs 和WHERE 条件在SELECT 中添加的任何行

    最后,您会得到如下所示的内容:

    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 加入源表中。如果没有实际表、列等的更多细节,这很难解释。

    【讨论】:

    • 为了回答你的问题,我只会插入不存在的行,之后不需要使用类似的方法更新任何内容。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2020-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多