将数据从临时表复制到多个表

问题描述:

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

2 downvotes无评论。不是很有帮助。 – ComeIn

如此有效地,你是从S分裂出一个3行以上的行吗? 为什么不使用表S中的主键而不是要使用的“链接”键?

你最好还是能够加入这些数据,您想要的方式,你也可以加入表A和C不使用B.

附:如果您在S中没有PK,或者处于不想复制的形状,则仍然可以在一个表中使用代理键并从另外两个表中引用它。

这里是为表下的解决方案,可以将其调整为其他表:

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/re移动你需要的密钥的等级):

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 
+0

非常感谢您的回复。请参阅我的编辑。 – ComeIn

+0

您可以在从分段导入时始终删除约束和索引,并在导入完成后重新创建它们。使用自然键来计算代理项。如果有标识列,请使用SET IDENTITY INSERT,完成后使用DBCC RESEED将标识设置为适当的值。仅仅因为数据被重复清除并不意味着没有冗余。如果它没有冗余,你甚至需要拆分表格吗? – Bistabil

我结束了使用实体框架6 BulkInsert工具。我发现使用我已经定义的模型类更容易。在迭代它们并构造a,b和c并最终在一次调用中保存它们之前,我只是将所有对象从staging对象读入staging对象列表中。在10秒内5.5K行。

感谢您的协助@Bistabil