Sql server 将数据从临时表复制到多个表
在SQL Server 2016中,我有一个包含8列的暂存表。我想将该数据复制到3个表[A]、[B]和[C]。[A] 将FK设置为[B],并且[B]将FK设置为[C]。第1-2列至[c],第3列至[a],第4-8列至[B] 谁能告诉我怎么做?效率不是最重要的,因为只有5.5公里 非常感谢您的帮助 编辑: 应该说得更清楚: 表a、b和c已存在,且PK和FK已就位。 c对col1和col2的concatation有唯一的约束。 a、 b和c使用标识PK 要导入的数据已清除重复项。Sql server 将数据从临时表复制到多个表,sql-server,merge,staging-table,Sql Server,Merge,Staging Table,在SQL Server 2016中,我有一个包含8列的暂存表。我想将该数据复制到3个表[A]、[B]和[C]。[A] 将FK设置为[B],并且[B]将FK设置为[C]。第1-2列至[c],第3列至[a],第4-8列至[B] 谁能告诉我怎么做?效率不是最重要的,因为只有5.5公里 非常感谢您的帮助 编辑: 应该说得更清楚: 表a、b和c已存在,且PK和FK已就位。 c对col1和col2的concatation有唯一的约束。 a、 b和c使用标识PK 要导入的数据已清除重复项。 这么说,你实际上是
这么说,你实际上是从3张桌子上的S中分割出一行? 为什么不使用表S中的主键而不是要使用的链接键 您仍然可以按照您想要的方式连接数据,也可以在不使用B的情况下连接表A和表C p、 如果您在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
或
或者对我来说太含蓄了
SELECT
IDENTITY(int,1,1) AS ID
, col1
, col2
INTO c
FROM s
ORDER BY s.PrimaryKey
编辑:
如果您试图消除冗余,那么您可以使用密集的_列组,如添加/删除所需的密钥:
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
我最终使用了EntityFramework6BulkInsert工具。我发现使用我已经定义的模型类更容易。我只是将staging中的所有对象读取到staging对象列表中,然后对它们进行迭代,构造a、b和c,最后在一个调用中保存它们。10秒以内5.5K行
感谢您的帮助@Bistabil非常感谢您的回复。请查看我的编辑。在从暂存进行导入时,您始终可以删除约束和索引,并在导入完成后重新创建它们。使用自然关键点计算代理关键点。使用SET IDENTITY INSERT如果有标识列,请在完成后使用DBCC RESEED将标识设置为正确的值。仅仅因为数据被清除了重复项,并不意味着没有冗余。如果它没有冗余,你甚至需要拆分表吗?2次否决票,没有任何评论。不是很有帮助。
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