8

このテンプレートを使用して、異なるデータベースの 2 つのテーブルを互いに一致させる方法を見つけました。

INSERT [DestDB].[dbo].[TABLE]
SELECT source.* FROM 
[SourceDB].[dbo].[TABLE] AS source
LEFT OUTER JOIN
[DestDB].[dbo].[TABLE] AS dest
ON 
source.[PKColumn] = dest.[PKColumn]
WHERE dest.[PKcolumn] IS NULL

UPDATE dest
SET 
 dest.[PK_COLUMN1] = source.[PK_COLUMN1]
,dest.[COLUMN2] = source.[COLUMN2]
,dest.[COLUMN3] = source.[COLUMN3]
,dest.[COLUMN4] = source.[COLUMN4]
,dest.[COLUMN5] = source.[COLUMN5]
,dest.[COLUMN6] = source.[COLUMN6]
,dest.[COLUMN7] = source.[COLUMN7]
,dest.[COLUMN8] = source.[COLUMN8]

FROM 
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN 
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]

しかし、私が扱っているいくつかのテーブルには少なくとも 200 の列があり、コピーと貼り付けの力でこれを行うことは可能ですが、心皮トンネル症候群にかからない方法があるかどうかを知る必要があります.

Microsoft SQL Server 2005 を使用しています。

何かアドバイス?

4

2 に答える 2

9

名前を付けずに列を更新することはできないと思いますが、SQL と sys.columns ビューを使用してスクリプトを作成することはできます。

select ',dest.[' + name + '] = source.[' + name +']' 
from sys.columns 
WHERE object_id = OBJECT_ID(N'[dbo].[Widgets]')

-- 出力 --

,dest.[WidgetId] = source.[WidgetId]
,dest.[WidgetName] = source.[WidgetName]
,dest.[CreatedDt] = source.[CreatedDt]
,dest.[WidgetValue] = source.[WidgetValue]
,dest.[ModifiedDt] = source.[ModifiedDt]

他の唯一の方法は、更新ではなく、代わりに dest テーブルを切り捨てて、SELECT INTO

SELECT * INTO DEST FROM SOURCE
于 2012-08-27T15:06:21.757 に答える
0

動的SQL(および@ChrisGesslerが提供する情報)を使用して、必要なことを行うことができます。

使用できない、または使用したくない場合の別の可能性は次のとおりです。

  1. 一致する行を新しいテーブルに渡す
  2. dest テーブルの行を削除します
  3. dest テーブルに行を追加します

ステップ 1 は次のようになります。

SELECT * INTO newtable
FROM 
[SourceDB].[dbo].[TABLE] AS source
INNER JOIN 
[DestDB].[dbo].[TABLE] AS dest
ON source.[PK_Column1] = dest.[PK_Column1]

最後に newtable を削除することを忘れないでください。

于 2012-08-27T15:11:01.390 に答える