2011-08-12 30 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 
相關問題