【问题标题】:Copying data from staging table to multiple tables将数据从临时表复制到多个表
【发布时间】:2016-08-17 06:05:21
【问题描述】:

在 SQL Server 2016 中,我有一个 8 列的临时表 [S]。我想将该数据复制到 3 个表 [A]、[B] 和 [C]。 [A] 对 [B] 有 FK,而 [B] 对 [C] 有 FK。第 1-2 列到 [c],第 3 列到 [a],第 4-8 列到 [B]。

谁能告诉我如何做到这一点?效率不是最重要的,因为只有 5.5Krows。

非常感谢任何帮助。

编辑:

应该更清楚:

  • 存在表 a、b 和 c,并具有 PK 和 FK。
  • c 对 col1 和 col2 的连接有唯一的约束。
  • a、b 和 c 使用 IDENTITY PK
  • 要导入的数据已清除重复项。

【问题讨论】:

  • 2 反对票,没有评论。不是很有帮助。

标签: sql-server merge staging-table


【解决方案1】:

我最终使用了 Entity Framework 6 BulkInsert 工具。我发现使用我已经定义的模型类更容易。我只是将所有对象从 staging 读取到一个 staging 对象列表中,然后迭代它们并构造 a、b 和 c,最后将它们全部保存在一个调用中。在 10 秒内完成 5.5K 行。

感谢您的帮助@Bistabil

【讨论】:

    【解决方案2】:

    如此有效地,您将 S 中的一行分成 3 个表? 为什么不使用表 S 中的主键而不是要使用的“链式”键?

    您仍然可以按照您想要的方式连接数据,您也可以在不使用 B 的情况下连接表 A 和 C。

    附言如果您在 S 中没有 PK,或者是您不想复制的形状,您仍然可以在一个表中使用代理键并从其他两个表中引用它。

    这是C表的解决方案,您可以为其他表调整它:

    CREATE TABLE c (
        ID int PRIMARY KEY
      , col1 int
      , col2 int
    )
    INSERT INTO c(id,col1,col2)
    SELECT
        ROW_NUMBER() OVER(ORDER BY s.PrimaryKey)
      , s.col1
      , s.col2
    FROM s
    

    INSERT INTO c(id,col1,col2)
    SELECT
        s.PrimaryKey
      , s.col1
      , s.col2
    FROM s
    

    或者(对我来说太隐晦了)

    SELECT
        IDENTITY(int,1,1) AS ID
      , col1
      , col2
    INTO c
    FROM s
    ORDER BY s.PrimaryKey
    

    编辑: 如果您想摆脱冗余,那么您可以像这样使用 DENSE_RANK() (为您需要的键添加/删除排名):

    SELECT DISTINCT
        DENSE_RANK() OVER(ORDER BY col1) AS PK_a
      , s1.col1
    INTO a
    FROM s1
    
    SELECT DISTINCT    
      DENSE_RANK() OVER(ORDER BY col2,col3) AS PK_b
      , DENSE_RANK() OVER(ORDER BY col1) AS FK_a
      , s1.col2
      , s1.col3
    INTO b
    FROM s1
    
    SELECT DISTINCT
        DENSE_RANK() OVER(ORDER BY col4) AS PK_c
      , DENSE_RANK() OVER(ORDER BY col1) AS FK_a
      , DENSE_RANK() OVER(ORDER BY col2, col3) AS FK_b
      , col4
    INTO c
    FROM s1
    

    【讨论】:

    • 非常感谢您的回复。请查看我的编辑。
    • 您可以在从暂存区导入时删除约束和索引,并在导入完成后重新创建它们。利用自然键来计算代理键。如果您有标识列,请使用 SET IDENTITY INSERT,完成后使用 DBCC RESEED 将标识设置为适当的值。仅仅因为数据被清除了重复并不意味着没有冗余。如果它没有冗余,你甚至需要拆分表吗?
    猜你喜欢
    • 2017-07-13
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 2021-07-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多