【问题标题】:How to update all tables in a database comparing with another database? [closed]与另一个数据库相比,如何更新数据库中的所有表? [关闭]
【发布时间】:2018-03-15 03:13:31
【问题描述】:

我有一个包含 500 多个表的数据库,现在有一个来自旧备份的该数据库的副本。我们注意到新数据库中有许多缺失的记录,我想从旧数据库中更新?

从另一个数据库更新所有记录的最佳做法是什么,我们可以使用查询单独完成,但这很耗时,而且我们有截止日期。是否有任何替代或最佳方法来实现这一点。

问候

【问题讨论】:

  • 这个问题太笼统了。如果与 id 有冲突,您将如何选择哪些记录是正确的?如果某些记录已更改,您是否要执行更新?如果需要,您会删除记录吗?如果需要添加具有依赖于主键的关系的记录但 id 被其他记录占用怎么办。听起来像是一个无法在截止日期前解决的问题。
  • 有很多第三方工具可以跨数据库进行数据比较。 redgate 的 SQL 数据比较就是其中之一。像这样的东西就像你可以得到这种类型的简单按钮一样接近。当架构不同时,处理诸如处理之类的事情非常复杂。我喜欢最后期限。我喜欢它们飞过时发出的嗖嗖声。

标签: sql sql-server database merge bulkupdate


【解决方案1】:

首先要指出的是,这可能本身就很危险。

您可能希望在每个表上都有时间戳以提高性能,否则您将遇到潜在的记录冲突问题。如果没有时间戳,您真的想确定您没有启用 identity_inserts 并且数据库备份没有独立于当前系统写入。

但是如果你有时间戳,或者有保证的方式来识别记录以避免冲突等,并且你真的想自己动手而不是使用可用的数据比较工具之一......

您可以使用动态查询编写存储过程,并使用 INFORMATION_SCHEMA.TABLES 遍历每个表并执行创建的插入语句。

EXEC sp_execute '' 是动态查询的结构。为查询创建一个变量,使用游标遍历 INFORMATION_SCHEMA_TABLES 和 INFORMATION_SCHEMA_TABLES 来构造 SQL 语句。

希望这些信息足以帮助您构建动态 SQL 查询,从而有效地对每个表执行以下操作:

INSERT INTO TableA(Col1, Col2, ColN) 
SELECT
    Col1, Col2, ColN 
FROM
    OldDatabase.TableA
WHERE
    TableA.[ID or Timestamp] NOT IN OldDatabase.[ID or TIMESTAMP]

但是您确实想检查为什么您会丢失这些记录。或许也可以将它们插入到日志表中,以确保您事后可以返回并检查原因。

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    • 1970-01-01
    • 1970-01-01
    • 2020-05-04
    • 2022-01-23
    相关资源
    最近更新 更多