【问题标题】:Replace NULL columns in live database with data from a SQL Server backup用 SQL Server 备份中的数据替换实时数据库中的 NULL 列
【发布时间】:2018-09-24 16:05:35
【问题描述】:

我最近犯了一个可怕的错误。

在尝试解决我们在 Exact Synergy 系统中遇到的问题时,我试图将一个帐户的两列中的数据替换为 NULL,而我将所有帐户中的这两列替换为 NULL。从备份中完全恢复不是一种选择,所以现在我正试图弄清楚如何替换丢失的数据。

我已将此数据库的最近备份完全还原到测试数据库,并确认我需要的数据在那里。我正在尝试弄清楚如何正确编写将替换两列中的数据的查询。

由于这是同一数据库的备份,因此表和列的名称都相同。

  • 数据库是Synergy 和Synergy_TESTDB
  • 表的所有者是dbo
  • 该表名为Addresses
  • 这些列被称为textfield1 和textfield2

我想做的是从备份数据库中获取textfield1 和textfield2 中的数据,并使用它来填充实时数据库中的空列或NULL 列。

我对 SQL 非常陌生,如果有任何帮助,我将不胜感激。

【问题讨论】:

  • 抱歉,太晚了,发帖之间有一段时间,所以我回家了,我现在回来看看。
  • 你的结果是什么?
  • @MitchWheat 我已经发布了结果以回应您在下面的回答,但我仍然无法让它工作。奇怪的是,当时我对你的提及似乎没有通过,我现在才意识到我不应该在你的名字和姓氏之间放置空格。

标签: sql-server sql-server-2008


【解决方案1】:

这显然是未经测试的。我对您使用此代码不承担任何责任。 那就是说我想尝试帮助你。

重点是由 3 部分组成的 database.table 命名:我假设您将备份恢复到同一台服务器。我还假设您在桌子上有一个主键?而那个 Synergy_TESTDB 就是恢复的数据库:

update target 
set target.textfield1 = source.textfield1 
from Synergy.dbo.Addresses target
join Synergy_TESTDB.dbo.Addresses source on target.PrimaryKeyCol = source.PrimaryKeyCol
where target.textfield1 IS NULL

update target 
set target.textfield2 = source.textfield2 
from Synergy.dbo.Addresses target
join Synergy_TESTDB.dbo.Addresses source on target.PrimaryKeyCol = source.PrimaryKeyCol
where target.textfield2 IS NULL

(当然可以在一次更新中完成,但我尽量保持简单。)

我强烈建议您先在另一个测试数据库中尝试。

养成一个好习惯是使用这样的模式:

BEGIN TRANSACTION

-- Perform updates

-- Examine the results: select * from dbo.Blah ...

-- If results are wrong, we just rollback anyway
ROLLBACK

-- If results are what you want, uncomment the COMMIT and comment out the ROLLBACK
-- COMMIT TRANS

【讨论】:

  • 我已经输入了脚本,并将 PrimaryKey 替换为两个表的 textfield1 行的键名(PK_Addresses_1),但是当我尝试执行时它告诉我它是无效的列名, 如果我将 PrimaryKey 保留为 PrimaryKey,则文本相同。会继续戳它,看看我是否能弄清楚我做错了什么,除非它对你来说非常明显。非常感谢您的帮助!我整天都被困在这上面!
  • 如果我使用 textfield1 而不是 PK_Addresses_1 或 PrimaryKey 它不会产生错误,但它也不会更改任何行,嗯...
  • 不要使用主键的名称'PK_Addresses_1',使用作为主键的列的名称,例如'Id'。发布表的架构,请包括 PK 定义。
  • 我此时在两个数据库中分配键的列名都是textfield1,这些的Table_Schema都是dbo。我通过使用查询select * from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='Addresses' 提取了此信息当我使用 textfield1 代替 PrimaryKeyCol 时,我没有收到任何错误,但也没有更改任何行,我认为这可能是一个区分大小写的问题,所以我也尝试了 null 和空。
  • 抱歉,我刚刚读到需要提及您才能收到通知。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多