Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вопрос по SSIS  [new]
Michail A.
Member

Откуда:
Сообщений: 96
Добрый день, подскажите, пож-та.

Нужно через SSIS пакет настроить обновление таблицы - справочника. То есть нужно обновлять имеющиеся записи и добавлять отсутствующие.

Я так понимаю, что для этого можно использовать элемент Lookup. Вопрос, собственно корректно ли использовать данный элемент под указанную задачу и есть ли какие либо ограничения в использовании?
22 июл 19, 13:45    [21931717]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SSIS  [new]
msLex
Member

Откуда:
Сообщений: 7736
Michail A.
Добрый день, подскажите, пож-та.

Нужно через SSIS пакет настроить обновление таблицы - справочника. То есть нужно обновлять имеющиеся записи и добавлять отсутствующие.

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

Можно, так часто и делают.
Для небольшого потока вполне подходит, для интенсивных изменений лучше использовать push down processing. Материализовывать данные в постоянную или временную таблицу и мержить SQL командами (merge или insert/update)

Если будете пользоваться lookup-ом надо помнить несколько вещей
1. Для больших справочников отключать кеширование в lookup-е
2. Входящий поток должен быть уникальным
22 июл 19, 14:08    [21931732]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос по SSIS  [new]
Yuri Abele
Member

Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
Сообщений: 1661
Помните только, что в случае использования SSIS обновления будут идти итеративно, для каждой записи свой UPDATE.
Если с точки зрения производительности это OK, то OK! :-)
Если же нет, то надо думать о какой-то BATCH LOAD логике.
Например
  • выгружать очередную порцию в промежуточную таблицу, а потом с ней соединяться в одном UPDATE
  • как предыдущем варианте, но использовать MERGE
  • генерить CUSTOM запрос, где очередной пакет в Table Value Constructor упакован и с ним уже UPDATE/INSERT или MERGE

    возможны варианты с передачей JSON, XML или CUSTOM табличного типа данных
  • 22 июл 19, 14:20    [21931742]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    Yuri Abele
    Member

    Откуда: Латвия> Литва > Тольятти > Wiesbaden > Karlsruhe
    Сообщений: 1661
    Yuri Abele
    ... то надо думать о какой-то BATCH LOAD логике ...

    В SSIS этим не пользовался, но уверен, что для такого есть решения соронних поставщиков (я про расширения для SSIS)
    22 июл 19, 14:24    [21931745]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    Michail A.
    Member

    Откуда:
    Сообщений: 96
    msLex, для небольших потоков - это для каких?

    И по п.2 - что имеется ввиду, что поток должен быть уникальным?
    22 июл 19, 14:30    [21931749]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    msLex
    Member

    Откуда:
    Сообщений: 7736
    Michail A.
    msLex, для небольших потоков - это для каких?

    Если у вас хотя бы 10-ки тысяч изменений в час, стоит задуматься.
    Michail A.
    И по п.2 - что имеется ввиду, что поток должен быть уникальным?


    Стандартный воркфлоу с lookup-ом:

    1. Lookup: Проверяем через lookup наличие записи с ключом в базе и делим на два потока insert и update
    2.1 Insert: Соответственно, вставляем запись
    2.2 Update: Соответственно, обновляем запись


    Проблема (а точнее особенность) в том, что эти компоненты работают асинхронно.
    Если в Lookup придут две записи с одним ключом, отсутствующим в таргет таблице, есть не иллюзорный шанс, что первая из них еще не будет вставлена до проверки на lookup-е второй, а значит и вторая запись уйдет в insert потоки.
    22 июл 19, 14:39    [21931751]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    Michail A.
    Member

    Откуда:
    Сообщений: 96
    msLex, нет ли примера, как реализуется поток update?
    22 июл 19, 17:31    [21931968]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    msLex
    Member

    Откуда:
    Сообщений: 7736
    Michail A.
    msLex, нет ли примера, как реализуется поток update?


    Обычный OLE DB Command с параметризированным update
    22 июл 19, 17:42    [21931978]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    Michail A.
    Member

    Откуда:
    Сообщений: 96
    msLex, вот именно параметризованный update интересует.

    Как в данном update выбрать только те строки, в которых происходило изменение значений полей?
    22 июл 19, 17:52    [21931986]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    SQL2008
    Member

    Откуда: Москва
    Сообщений: 4101
    Michail A.
    Нужно через SSIS пакет настроить обновление таблицы - справочника. То есть нужно обновлять имеющиеся записи и добавлять отсутствующие.

    Если позволяет версия, то иcпользуйте SQL Script и MERGE.
    22 июл 19, 17:57    [21931994]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    msLex
    Member

    Откуда:
    Сообщений: 7736
    Michail A.
    msLex, вот именно параметризованный update интересует.

    Как в данном update выбрать только те строки, в которых происходило изменение значений полей?

    обычный

    update dbo.ttt set ... where id = ?
    
    22 июл 19, 18:03    [21931999]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    Michail A.
    Member

    Откуда:
    Сообщений: 96
    msLex, а можно ли в рамках данного потока как нибудь сравнить записи, и произвести update только тех записей, в которых были изменения?
    22 июл 19, 18:19    [21932014]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    msLex
    Member

    Откуда:
    Сообщений: 7736
    Michail A.
    msLex, а можно ли в рамках данного потока как нибудь сравнить записи, и произвести update только тех записей, в которых были изменения?

    можно.

    Например, "влоб" добавить
    and (
    field1 != ?
    or filed2 != ?
    ...
    )


    если в полях допустимы null, добавить isnull(...)
    22 июл 19, 18:35    [21932029]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    Michail A.
    Member

    Откуда:
    Сообщений: 96
    В этом случае получаю ошибку "error at data flow task [ole db command [27]]: Parameters are not bound. All parameters in the SQL command must be bound to input columns.

    Т.е. я так понимаю вопрос в том, что поставить в соответствие параметрам, которые возникают после добавлении данной секции (
    and (
    field1 != ?
    or filed2 != ?
    ...
    ))

    К сообщению приложен файл. Размер - 139Kb
    22 июл 19, 19:21    [21932054]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    SQL2008
    Member

    Откуда: Москва
    Сообщений: 4101
    Michail A., почитайте что означает назначение (привязка) параметров (Bound parameters)
    У вас этого нет, отсюда и ошибка.
    23 июл 19, 10:36    [21932381]     Ответить | Цитировать Сообщить модератору
     Re: Вопрос по SSIS  [new]
    Michail A.
    Member

    Откуда:
    Сообщений: 96
    SQL2008,

    можно чуть более подробно куда копать? пока не увидел применения.
    23 июл 19, 11:55    [21932515]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить