将数据从临时表复制到多个表
问题描述:
在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
- 要导入的数据已被清除重复项。
答
如此有效地,你是从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
答
我结束了使用实体框架6 BulkInsert工具。我发现使用我已经定义的模型类更容易。在迭代它们并构造a,b和c并最终在一次调用中保存它们之前,我只是将所有对象从staging对象读入staging对象列表中。在10秒内5.5K行。
感谢您的协助@Bistabil
2 downvotes无评论。不是很有帮助。 – ComeIn