2017-01-12 12 views
1

同じテーブルを持つ2つのデータベースがありますが、データは異なります。私は2番目のデータベースのテーブルからすべてのデータを取得し、最初のものの既存の値を更新したいと思います。

このようなエントリがない場合は、新しいエントリを挿入します。ここ は(動作しない)私のコードです:テーブルエイリアスを使用して別のデータベースのテーブルをUPSERTする

UPDATE tbl1 
SET tbl1.Field1 = tbl2.Field1 
FROM [test1].[dbo].[Table1] tbl1, [test2].[dbo].[Table1] tbl2 
WHERE tbl1.Id = tbl2.Id 

IF @@ROWCOUNT = 0 
    INSERT INTO tbl1 (tbl1.Id, tbl1.Field1) 
    VALUES ([test2].[dbo].[Table1].Id, [test2].[dbo].[Table1].Field1) 

私はエラーメッセージを次のようしています。

メッセージ4104、レベル16、状態1、行9
マルチパート識別子 "test2.dbo.Table1.Id" バインドできませんでした。

メッセージ4104、レベル16、状態1、行9
マルチパート識別子「test2.dbo.Table1.Field1」はバインドできませんでした。

問題はエイリアスの使用法が間違っていると思いますが、正確に何が間違っているのかわかりません。

答えて

4

あなたはこのためにMERGEステートメントを使用することができます。

Merge [test1].[dbo].[Table1] As Target 
Using [test2].[dbo].[Table1] As Source On Target.Id = Source.Id 
When Matched Then Update 
    Set Field1 = Source.Field1 
When Not Matched Then Insert 
     (Id, Field1) 
Values (Source.Id, Source.Field1); 
+0

作品のようなSTHを使用する必要があります!ありがとう! –

1

問題は、あなたがこの声明の中で

INSERT INTO tbl1 (tbl1.Id, tbl1.Field1) 
VALUES ([test2].[dbo].[Table1].Id, [test2].[dbo].[Table1].Field1)

を使用している、定数または変数にのみ使用することができるということです。

しかし、あなたはおそらく魅力とその

INSERT INTO [test2].[dbo].[Table1] (Id, Field1) 
SELECT tbl2.Id, tbl2.Field1 FROM [test1].[dbo].[Table1] tbl1 
WHERE NOT EXISTS(
    SELECT * FROM [test2].[dbo].[Table1] tbl2 WHERE tbl2.ID=tbl1.ID 
)
関連する問題