2011-08-12 31 views
2

表中的一行被错误地覆盖。我有一个表的备份,需要用备份数据更新主表中的一行。问题在于桌子有近100列。是否有一种简单的方法可以在SQL Server中执行此操作,以便我不必手动输出:基于具有名称列名的另一个表更新表中100列的行的列号

set maintable.a = backuptable.a, 
    maintable.b = backuptable.b,......etc. 

一直到第100列。我认为SQL Server Management Studio可以知道我想用另一个表中的同名字段来更新字段。有没有办法做到这一点?

在此先感谢。

回答

5
INSERT INTO MainTable 
SELECT * 
FROM BackUpTable 
WHERE RowID = GoodRow 

DELETE FROM MainTable 
WHERE RowId = BadRow 

只需插入“好”行并删除“坏”行。

如果存在PK约束,则可以按相反顺序删除/插入。

把它放在TRANSACTION中也是明智的。

+0

如果主键是标识列,该怎么办?我收到以下错误:“当IDENTITY_INSERT设置为OFF时,无法在表'成员'中为标识列插入显式值。” – Ojen

+0

如果它是一个“身份”,那么你需要使用明确的列列表。没有办法绕过它。 – JNK

1

在SSMS中,您可以将对象资源管理器中的columns节点拖放到查询窗口。它会生成一个由逗号分隔的所有列的字符串。

+1

+1 - 好点。虽然 – JNK

+0

@JNK将是一个PITA来写出更新的语法 - 这是真的。在插入物中使用时更方便。 –

0
> declare @aa varchar (max) set @aa = '' 
> 
> select @aa = 
>  (case when @aa = '' 
>  then column_name 
>  else @aa + coalesce(', ' + column_name+'= '+column_name, '') 
>  end) from amicus.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'People' print @aa 
相关问题