/ / UPSERT таблицю з іншої бази даних, використовуючи псевдонім таблиці - sql, sql-сервер, база даних

UPSERT таблицю з іншої бази даних, використовуючи аліас таблиці - sql, sql-server, database

У мене є дві бази даних з однаковими таблицями, але різними даними. Я хочу взяти всі дані з таблиці у другій базі даних та оновити існуючі значення в першій.

Якщо такого запису немає, я хочу вставити новий. Ось мій код (який не працює):

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"неможливо пов'язати.

Я думаю, що проблема полягає у неправильному використанні псевдонімів, але я не можу зрозуміти, що саме я роблю неправильно.

Відповіді:

5 за відповідь № 1

Ви можете використовувати a 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);

1 для відповіді № 2

Проблема в тому, що ви використовуєте

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
)