将暂存 table 中的数据复制到多个 table 中

Copying data from staging table to multiple tables

在 SQL Server 2016 中,我有一个包含 8 列的暂存 table [S]。我想将该数据复制到 3 tables [A]、[B] 和 [C]。 [A] 有 FK 到 [B],[B] 有 FK 到 [C]。第 1-2 列转到 [c],第 3 列转到 [a],第 4-8 列转到 [B]。

谁能告诉我该怎么做?效率不是最重要的,只有5.5Krows。

非常感谢任何帮助。

编辑:

应该说得更清楚:

如此有效,您将 S 中的一行拆分为 3 tables? 为什么不使用 table S 中的主键而不是 "chained" 您要使用的键?

您仍然可以按照自己的方式加入数据,您还可以在不使用 B 的情况下加入 tables A 和 C。

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

这是 table C 的解决方案,您可以针对其他 table 进行调整:

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() (add/remove 为你需要的键排名):

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

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

感谢@Bistabil 的协助