Процедура сравнения и синхронизации на уровне таблицы для T-SQL - PullRequest
5 голосов
/ 10 марта 2010

Меня интересует исходный код T-SQL для синхронизации таблицы (или, возможно, ее подмножества) с данными из другой аналогичной таблицы. Две таблицы могут содержать любые переменные, например, у меня может быть

 base table    source table 
 ==========    ============
 id     val    id       val
 ----------    ------------
 0        1    0          3
 1        2    1          2
 2        3    3          4

или

 base table             source table 
 ===================    ==================
 key    val1    val2    key   val1    val2
 -------------------    ------------------
 A         1       0    A        1       1  
 B         2       1    C        2       2
 C         3       3    E        4       0

или любые две таблицы, содержащие похожие столбцы с похожими именами. Я хотел бы иметь возможность

  • проверьте, что две таблицы имеют совпадающие столбцы: исходная таблица имеет точно такие же столбцы, что и базовая таблица, и типы данных совпадают
  • сделать diff из базовой таблицы в исходную таблицу
  • делать необходимые обновления, удаления и вставки для изменения данных в базовая таблица для соответствия исходной таблице
  • опционально ограничить diff до подмножества базовой таблицы,

предпочтительно с хранимой процедурой. Кто-нибудь написал для этого сохраненный процесс или вы могли бы указать на источник?

Ответы [ 3 ]

4 голосов
/ 10 марта 2010

SQL Server 2008 содержит новый оператор слияния . Это очень гибкий, если немного сложный для записи.

Например, следующий запрос синхронизирует таблицы @base и @source. Он ограничен подмножеством @base, где id <> 2:

MERGE @base as tgt
USING @source as src
ON tgt.id = src.id and tgt.val = src.val
WHEN NOT MATCHED BY TARGET
    THEN INSERT (id, val) values (src.id, src.val)
WHEN NOT MATCHED BY SOURCE AND tgt.id <> 2
    THEN DELETE
1 голос
/ 10 марта 2010

Интересный вопрос.

Вы можете начать с ИСКЛЮЧЕНИЯ - ИНТЕРСЕКТ

http://msdn.microsoft.com/en-us/library/ms188055.aspx

Вот готовое решение, может помочь вам

http://www.sqlservercentral.com/scripts/Miscellaneous/30596/

1 голос
/ 10 марта 2010

Не уверен, полезен ли он для вашей конкретной ситуации, но этот тип операции обычно и относительно легко выполняется с помощью внешних инструментов (SQL Workbench diff, SQL Compare и т. Д.). Его даже можно написать в сценарии, но, вероятно, его нельзя вызвать из процедуры T-SQL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...