Имитация SQL-Merge с вставкой и обновлением

У меня есть две локальные и удаленные базы данных с односторонним доступом от локального к удаленному. и мы можем вставлять и обновлять удаленную базу данных только из локальной базы данных. Я написал запрос на слияние, но не смог выполнить EXEC на удаленном компьютере, потому что удаленная база данных не может получить доступ к исходной базе данных, поэтому я хочу преобразовать ее в команды вставки и обновления. Если в удаленной базе данных есть строка, ее следует обновить, а если она не существует, ее следует вставить.

Мой код слияния

MERGE INTO [RemoteIp].[dbname].[dbo].[MTest] AS [Target]
USING (SELECT * FROM [dbo].[Products]
) AS [Source] ([ProductID],[ProductName],[Rate])
 ON ([Target].[PID] = [Source].[ProductID])
  WHEN MATCHED AND (
    NULLIF([Source].[ProductID], [Target].[PID]) IS NOT NULL OR NULLIF([Target].[PID], [Source].[ProductID]) IS NOT NULL OR 
    NULLIF([Source].[ProductName], [Target].[ProductName]) IS NOT NULL OR NULLIF([Target].[ProductName], [Source].[ProductName]) IS NOT NULL OR 
    NULLIF([Source].[Rate], [Target].[Rate]) IS NOT NULL OR NULLIF([Target].[Rate], [Source].[Rate]) IS NOT NULL) THEN
 UPDATE SET
  [Target].[PID] = [Source].[ProductID], 
  [Target].[ProductName] = [Source].[ProductName], 
  [Target].[Rate] = [Source].[Rate]
WHEN NOT MATCHED BY TARGET THEN
 INSERT([PID],[ProductName],[Rate]) 
 VALUES([Source].[ProductID],[Source].[ProductName],[Source].[Rate]);

Я пробую это для вставки и обновления

IF EXISTS(SELECT * FROM [RemoteIP].[DBName].[db].[Mtest])
BEGIN
    --update existing row
UPDATE
    [RemoteIP].[DBName].[db].[Mtest]
SET
    [RemoteIP].[DBName].[db].[Mtest].pid = products.ProductID,
    [RemoteIP].[DBName].[db].[Mtest].ProductName = products.ProductName,
    [RemoteIP].[DBName].[db].[Mtest].Rate = products.Rate
FROM
    Mtest tr INNER JOIN products sr
        ON tr.pid = sr.ProductID
END
ELSE
BEGIN
    --insert new row
    INSERT INTO [RemoteIP].[DBName].[db].[Mtest] (pid, ProductName, Rate)
    VALUES ([products].[ProductID], [products].[ProductName], [products].[Rate])

Я получаю эту ошибку при запуске моего запроса в

The multi-part identifier …… could not be bound in line 4

person mohammad    schedule 02.08.2020    source источник
comment
Вы не можете получить доступ к БД только по ее IP. Вы должны Сначала создайте связанный сервер   -  person Code Different    schedule 02.08.2020
comment
@Code Different Я проверил, и связанный сервер уже создан. я могу выбрать * из [RemoteIP].[DBName].[db].[Mtest], но когда я использую обновление [RemoteIP].[DBName].[db].[Mtest] он принимает составной идентификатор [RemoteIP] .[DBName].[db].[Mtest] не может быть привязан   -  person mohammad    schedule 02.08.2020
comment
Кроме того, использование имен столбцов, состоящих из двух и более частей, должно быть удалено из SQL Server. Придерживайтесь псевдонимов и уточняйте их столбцы.   -  person Larnu    schedule 02.08.2020
comment
Итак, вы просто удалили свой предыдущий вопрос и начали заново. Но все же вы отказываетесь признать, что ваша попытка вставки/обновления НЕ совпадает с MERGE, поскольку ваша попытка будет либо INSERT, либо UPDATE (но не оба).   -  person SMor    schedule 02.08.2020


Ответы (1)


Следующим шагом будет проверка синтаксиса команды UPDATE. Как только вы назвали [RemoteIP].[DBName].[db].[Mtest] псевдонимом tr, больше нет [RemoteIP].... в области действия команды. Есть только tr. Попробуй это:

UPDATE
    tr
SET
    pid         = sr.ProductID,
    ProductName = sr.ProductName,
    Rate        = sr.Rate
FROM
    [RemoteIP].[DBName].[db].[Mtest] tr INNER JOIN products sr
        ON tr.pid = sr.ProductID
person Code Different    schedule 02.08.2020