首页 > 解决方案 > 用 SQL Server 备份中的数据替换实时数据库中的 NULL 列

问题描述

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

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

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

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

我想做的是从备份数据库中取出数据,textfield1textfield2使用它来填充实时数据库中的空列或 NULL 列。

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

标签: sql-serversql-server-2008

解决方案


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

要点是由 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

推荐阅读