-2

在 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
  • 要导入的数据已清除重复项。
4

2 回答 2

0

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

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

ps 如果你在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
于 2016-04-23T19:28:38.030 回答
0

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

感谢您的帮助@Bistabil

于 2016-04-25T14:02:46.893 回答