将暂存 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。
非常感谢任何帮助。
编辑:
应该说得更清楚:
- 表 a、b 和 c 存在并且具有 PK 和 FK。
- c 对 col1 和 col2 的串联有唯一约束。
- a、b 和 c 使用 IDENTITY PK
- 要导入的数据已清除重复项。
如此有效,您将 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 的协助
在 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。
非常感谢任何帮助。
编辑:
应该说得更清楚:
- 表 a、b 和 c 存在并且具有 PK 和 FK。
- c 对 col1 和 col2 的串联有唯一约束。
- a、b 和 c 使用 IDENTITY PK
- 要导入的数据已清除重复项。
如此有效,您将 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 的协助