Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 将数据从临时表复制到多个表_Sql Server_Merge_Staging Table - Fatal编程技术网

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

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 要导入的数据已清除重复项。 这么说,你实际上是

在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