簡體   English   中英

將數據從臨時表復制到多個表

[英]Copying data from staging table to multiple tables

在 SQL Server 2016 中,我有一個包含 8 列的臨時表 [S]。 我想將該數據復制到 3 個表 [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 個表? 為什么不使用表 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

我最終使用了 Entity Framework 6 BulkInsert 工具。 我發現使用我已經定義的模型類更容易。 我只是將所有對象從暫存對象讀取到暫存對象列表中,然后再遍歷它們並構造 a、b 和 c,最后在一次調用中將它們全部保存。 5.5K 行,不到 10 秒。

感謝您的幫助@Bistabil

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM