UPSERT в SSIS - PullRequest
       47

UPSERT в SSIS

5 голосов
/ 15 июля 2009

Я пишу пакет служб SSIS для запуска на SQL Server 2008. Как вы выполняете UPSERT в службах SSIS?

IF KEY NOT EXISTS
  INSERT
ELSE
  IF DATA CHANGED
    UPDATE
  ENDIF
ENDIF

Ответы [ 7 ]

10 голосов
/ 16 июля 2009

См. SQL Server 2008 - Использование объединения из служб SSIS . Я реализовал что-то вроде этого, и это было очень легко. Достаточно просто использовать страницу BOL Вставка, обновление и удаление данных с помощью MERGE .

3 голосов
/ 15 июля 2009

Я бы посоветовал вам взглянуть на блог Мэтта Стивена по поводу наступления SQL Server.

SQL 2005 - UPSERT: По природе, но не по имени; но наконец!

2 голосов
/ 16 июля 2009

Основными командами языка управления данными (DML), которые использовались на протяжении многих лет, являются «Обновить», «Вставить» и «Удалить». Они делают именно то, что вы ожидаете: Insert добавляет новые записи, Update изменяет существующие записи, а Delete удаляет записи.

Оператор UPSERT изменяет существующие записи, если записи отсутствуют, ВСТАВЛЯЕТ новые записи. Функциональность статистики UPSERT может быть достигнута двумя новыми наборами операторов TSQL. Это две новые

EXCEPT
INTERSECT

За исключением: -

Возвращает любые различные значения из запроса слева от операнда EXCEPT, которые также не возвращаются из правого запроса

Intersect: - Возвращает любые различные значения, которые возвращаются как запросом слева, так и справа от операнда INTERSECT.

Пример: - Допустим, у нас есть две таблицы: Таблица 1 и Таблица 2

Table_1 column name(Number, datatype int)
----------

1
2

3
4
5

Table_2 column name(Number, datatype int)
----------

1
2

5

SELECT * FROM TABLE_1 EXCEPT SELECT * FROM  TABLE_2 

вернет 3,4, поскольку он присутствует в Таблице_1, а не в Таблице_2

SELECT * FROM TABLE_1 INTERSECT SELECT * FROM  TABLE_2 

вернет 1,2,5, поскольку они присутствуют в обеих таблицах Table_1 и Table_2.

Все боли сложных объединений теперь устранены :-)

Чтобы использовать эту функцию в службах SSIS, все, что вам нужно сделать, добавить задачу «Выполнить SQL» и поместить туда код.

1 голос
/ 26 августа 2011

Другой способ создать upsert в sql (если у вас есть таблицы pre-stage или stage):

--Insert Portion
INSERT INTO FinalTable
( Colums )
SELECT T.TempColumns
FROM TempTable T
WHERE
(
    SELECT 'Bam'
    FROM FinalTable F
    WHERE F.Key(s) = T.Key(s)
) IS NULL

--Update Portion
UPDATE FinalTable
SET NonKeyColumn(s) = T.TempNonKeyColumn(s)
FROM TempTable T
WHERE FinalTable.Key(s) = T.Key(s)
    AND CHECKSUM(FinalTable.NonKeyColumn(s)) <> CHECKSUM(T.NonKeyColumn(s))
0 голосов
/ 14 мая 2019

Помимо решений на основе T-SQL (и даже не помеченных как / ), вы можете использовать задачу потока данных SSIS с объединением слиянием, как описано здесь в другом месте ).

enter image description here

Важнейшей частью является полное внешнее объединение в соединении слияния (если вы хотите только вставить / обновить, а также не удаляет левое внешнее объединение) ваших отсортированных источников.

enter image description here

с последующим условным разделением, чтобы узнать, что делать дальше: вставить в место назначения (которое также является моим источником), обновить его (с помощью команды SQL) или удалить из него (снова с помощью команды SQL).

  1. INSERT: Если гид найден только у источника (слева)
  2. ОБНОВЛЕНИЕ Если gid существует как на источнике, так и на месте назначения
  3. УДАЛИТЬ: если гид не найден в источнике, но существует в пункте назначения (справа)

enter image description here

0 голосов
/ 23 апреля 2012

Я бы использовал задачу «медленно меняющееся измерение»

0 голосов
/ 08 декабря 2011

Я обычно предпочитаю, чтобы движок SSIS управлял слиянием дельты. Только новые элементы вставляются и изменяются обновляются. Если у вашего конечного сервера недостаточно ресурсов для управления сложными запросами, этот метод позволяет использовать ресурсы вашего сервера SSIS.

...