Вопрос

Я пытаюсь сравнить данные из двух систем. Основная идея:

  • Создайте временную таблицу.
  • Вставьте данные Table1.
  • Вставьте данные Table2 (таблица связанного удаленного сервера) с уникальными идентификаторами.
  • Фильтр, где первая или вторая таблица имеет разные информации.

Я пытаюсь получить второй набор вставок, от второй системы, для вставки и, если он дублирует вместо этого. Кажется, я не могу понять это правильно. Что мне следует иметь для последней вставки?

У меня нет «части фильтра», потому что у меня нет вставки данных Table2. Часть фильтра покажет строки, где активное, последнее или именное имя отличается между двумя системами. Простой where Table1LastName <> Table2LastName Тип утверждения.

Примечание: у меня есть это работа с 2 временными таблицами ... и полным внешним соединением и некоторым «где идентификатор нулевой». Я просто пытаюсь заставить это работать так, как я раньше не использовал.

if object_id('tempdb..#CompareDrs') is not null
    drop table #CompareDrs;
GO

create table #CompareDrs
(
     ID varchar(20) unique
    ,TABLE1Active varchar(1)
    ,TABLE1LastName varchar(50)
    ,TABLE1FirstName varchar(50)
    ,TABLE2Active varchar(1)
    ,TABLE2LastName varchar(50)
    ,TABLE2FirstName varchar(50)
);
GO

INSERT INTO #CompareDrs (ID, TABLE1Active, TABLE1LastName, TABLE1FirstName)
    SELECT
         right('00000000000000000000' + ForeignID, 20) ID
        ,case when Active = 0 then 'I'
              when Active = 1 then 'A'
              else ' '
         end       TABLE1Active
        ,LastName  TABLE1LastName
        ,FirstName TABLE1FirstName
    FROM
                  [DATABASE1].dbo.DRs
    Order By
        ID;
GO

INSERT Into #CompareDrs (ID, TABLE2Active, TABLE2LastName, TABLE2FirstName)
    SELECT 
         right('00000000000000000000' + Cast(DRDR# as Varchar(50)), 20) ID
        ,DRAFLG TABLE2Active
        ,DRLNAM TABLE2LastName
        ,DR1NAM TABLE2FirstName
    FROM
        [LINKEDERVER].[DATABASE].[CATALOG].[TABLE] DR
ON DUPLICATE KEY UPDATE TABLE2Active = VALUES(TABLE2Active), 
                        TABLE2LastName = VALUES(TABLE2LastName), 
                        TABLE2FirstName = VALUES(TABLE2FirstName),
GO

SELECT * FROM #CompareDrs;
Это было полезно?

Решение

Если вы используете SQL 2008, посмотрите на Слияние Заявление, он может делать то, что другие платформы вызывают Upsert, обновляются, если он существует, в противном случае вставьте.

Другие советы

Вы можете написать оператор SELECT, который фиксирует идентификаторы, которые были вставлены из первой вставки в таблицу температуры.

Затем просто вставьте из 2 -й таблицы, если только ID не содержатся в вашем предыдущем операторе выбора. Используйте оператор ELSE для реализации других строк в качестве обновления

Похоже, вы помещаете соответствующие ряды из двух таблиц в одну строку в другой таблице.

Если это так, то вам нужно

  • Вставить столбцы из первой таблицы и
  • Обновите другие столбцы из второй таблицы, где совпадают идентификационные номера и где другие столбцы являются нулевыми.

Я мог бы ошибаться в этом, потому что мне не совсем ясно, что идентификационные номера на двух таблицах будут соответствовать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с dba.stackexchange
scroll top