Есть несколько вещей, которые вы можете попробовать.Работа со связанным сервером и незнание специфики этой настройки, а также объема данных может привести к проблемам с производительностью.
Если вас не волнуют изменения в существующих записях или удаления, просто оставьте внешнююПри соединении вы получите все записи, которые еще не были вставлены в пункт назначения:
SELECT [s].[LOAD_ID]
, [s].[ASSETID]
, [s].[REC_STATUS]
FROM [LinkedServer].[Database].[schema].[SourceTable] [s]
LEFT OUTER JOIN [DestinationTable] [d]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHERE [d].[LOAN_ID] IS NULL;
Если вы беспокоитесь об изменениях, вы все равно можете использовать левое внешнее поле и искать значение NULL в пункте назначения или различия в полезначений, но тогда вам понадобится дополнительный оператор обновления.
SELECT [s].[LOAD_ID]
, [s].[ASSETID]
, [s].[REC_STATUS]
FROM [LinkedServer].[Database].[schema].[SourceTable] [s]
LEFT OUTER JOIN [DestinationTable] [d]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHERE [d].[LOAN_ID] IS NULL --Records from source not in destination
OR (
--This evaluates those in the destination, but then checks for changes in field values.
[d].[LOAN_ID] IS NOT NULL
AND (
[s].[REC_STATUS] <> [d].[REC_STATUS]
OR [s].[SomOtherField] <> [d].[SomeOtherField]
)
);
--The above insert into some landing or staging table on the destination side and then you could do a MERGE.
Если нам нужно беспокоиться об удалениях.Запись была удалена из источника, и вы больше не хотите ее видеть в месте назначения.Переверните левый край, чтобы найти записи в пункте назначения, которых больше нет в источнике:
DELETE [d]
FROM [DestinationTable] [d]
LEFT OUTER JOIN [LinkedServer].[Database].[schema].[SourceTable] [s]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHERE [s].[LOAD_ID] IS NULL;
Вы можете попытаться сделать все это с помощью слияния.Попробуйте выполнить MERGE на связанном сервере или перенести все исходные записи в место назначения в таблице земель / этапов, а затем выполнить слияние там.Вот пример попытки через связанный сервер.
MERGE [DestinationTable] [t]
USING [LinkedServer].[Database].[schema].[SourceTable] [s]
ON [s].[LOAN_ID] = [d].[LOAN_ID]
AND [s].[ASSETID] = [d].[ASSETID]
WHEN MATCHED THEN UPDATE SET [REC_STATUS] = [s].[REC_STATUS]
WHEN NOT MATCHED BY TARGET THEN INSERT (
[REC_STATUS]
)
VALUES ( [s].[REC_STATUS] )
WHEN NOT MATCHED BY SOURCE THEN DELETE;
При работе со слиянием, вы должны следить за этим утверждением:
WHEN NOT MATCHED BY SOURCE THEN DELETE;
Если вы не работаете свесь набор записей вы можете потерять записи в вашем пункте назначения.Например, вы ограничили набор результатов, который вы извлекли из источника, в промежуточную таблицу, теперь вы объединяете промежуточную таблицу с конечным пунктом назначения, и все, что вне этого, будет удалено в вашем пункте назначения.Вы можете решить эту проблему, ограничив вашу цель с помощью CTE, Google: «объединить в cte в качестве цели».Это если у вас есть дата, которую вы можете отфильтровать.
Если у вас есть столбец даты, это всегда полезно, особенно своего рода столбец даты изменения / обновления, когда новые записи вставляются или обновляются.Затем вы можете отфильтровать по своему источнику только те записи, которые вас интересуют.