【问题标题】:Copy data from SQL Server Staging to Live tables将数据从 SQL Server 暂存复制到实时表
【发布时间】:2017-08-04 13:11:17
【问题描述】:

我有一个带有临时表的 SQL Server 数据库,用户输入的数据在其中保存,直到他们最终提交申请表,此时数据被复制到实时表中。

所以我有一个名为ApplicationStaging 的表,其中包含列:

ApplicationID        1
UserID               2
CustomerName         'Joe Bloggs'
//More columns removed for brevity

然后我有一个名为ItemStaging 的表,其中包含列:

ItemID               1
ApplicationID (FK)   1
ItemName             'Car'
//More columns removed for brevity

然后我有我的实时Application 表和实时Item 表,它们现在包含与临时表完全相同的列名。我有大约 20 个这样的表,并且一些不同的表之间存在 FK 关系。在重新创建 FK 关系时,使用存储过程将数据从暂存表复制到活动表的最佳方法是什么(注意,从暂存到提交的 ID 可能会有所不同,具体取决于最终用户何时提交应用程序与何时提交已保存)。

我在想我需要在实时表上做的一件事是添加一个 StagingID 列并设置它,这样我就可以有一个链接返回到从暂存表

【问题讨论】:

  • 只是说显而易见的,但是如果表完全一样,并且它们在同一个数据库中,为什么不将信息存储在同一个表中并简单地使用一个位标志来指示记录已提交/未提交。使用一组表而不是 2 组,如果您这样做,它将为您节省大量不必要的代码。此外,想象一下,表结构发生变化,然后您有 2 个地方进行更改以及在表之间移植记录的代码。
  • 我会敦促您考虑@Tanner 的建议。但是,如果这不是一个选项,那么您期望在这里得到什么答案?由于我们基本上对任何人都可以响应的信息为零,因此您需要先插入父信息,然后再插入子信息。
  • @Tanner - 是的,这本来是理想的解决方案,但不幸的是,在我加入项目之前,数据库设计已经完成
  • @Tanner - 虽然您的建议适用于 99% 的情况,但在某些情况下临时表也不错: 1. 对提交新申请的人没有限制 - 您没有不想用垃圾向“生产”表发送垃圾邮件。 2. 允许乱序添加数据,这通常会违反生产表中的 FK 和其他约束。
  • @Tanner - 我不是在和你争论,只是指出在某些情况下 OP 的方法是可行的。我们对他的制度一无所知,因此没有必要就什么更好的问题展开意识形态战争。

标签: sql-server database


【解决方案1】:

两种解决方案:

使用Sequences 为生产表和临时表生成ID,那么您不必担心ID 映射。

如果序列不可行,则使用OUTPUT 子句提取 ID 映射:

INSERT INTO Parent
OUTPUT INSERTED.ID, StagingParent.ID INTO @ParentIDMapping( PID, SPID )
SELECT *
FROM StagingParent

INSERT INTO Child
OUTPUT INSERTED.ID, Child.ID INTO @ChildIDMapping
SELECT PID AS FK, * 
FROM StagingChild AS SC
    INNER JOIN @ParentIDMapping AS PID ON SC.FK = SPID 

请参阅此MSDN 文档底部的示例,了解如何使用OUTPUT

更新:由于INSERT 不允许您输出实际未插入的列,您需要使用MERGE。见:Is it possible to for SQL Output clause to return a column not being inserted?

【讨论】:

  • @Ctrl_Alt_Defeat - 以上是原型。如果您需要更具体的示例,请告诉我。注意:我也更新了答案:如果你想要直接映射,你需要使用MERGE 而不是更新。
  • 谢谢 - 试一试,让你知道 - 我不一定需要直接映射 - 所以在 Live Tables 中,我不介意 Id 是否与 Staging Tables 中的匹配
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-02-05
  • 2017-11-18
  • 2012-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多