SSIS - использование контейнера цикла foreach для обновления записей после передачи - PullRequest
0 голосов
/ 06 января 2011

Мы используем SSIS для передачи содержимого 3 таблиц с сервера A на сервер B

Сервер A находится в доме, Сервер B находится в центре обработки данных. Существует VPN-подключение от ServerA к ServerB и наоборот. Из соображений безопасности мы стремимся исключить возможность для ServerB «видеть» ServerA

Текущий оператор выбора SQL выглядит примерно так:

SELECT * FROM ServerB.OrderTable WHERE NOT IN ServerA.OrderTable

(я ценю, что синтаксис выключен)

Эти записи затем вставляются в ServerA.OrderTable (таблица идентична)

Это прекрасно работает - передача только тех записей, которые не находятся на сервере A

Однако для этого необходимо, чтобы ServerB знал о ServerA Что я предлагаю сделать, так это поместить битовый столбец «Передано» в каждую таблицу и просмотреть каждую запись, установив для параметра Передано значение true.

Таким образом, вышеупомянутый оператор SQL может быть изменен на что-то вроде:

SELECT * FROM ServerB.OrderTable WHERE Transferred = 0

Мой вопрос: как это сделать? Мне сообщили, что контейнер цикла foreach может сделать это, но я не могу найти это нигде ... Может ли кто-нибудь указать мне правильное направление

1 Ответ

3 голосов
/ 28 мая 2011

Возможно, вы уже нашли ответ на свой вопрос.Этот ответ должен помочь другим, кто может наткнуться на этот вопрос.Вот возможный вариант, который можно использовать для разрешения передачи данных с использованием служб SSIS.Я предположил, что вы все еще можете создавать строки подключения, указывающие на оба сервера A и B из пакета служб SSIS.Если это предположение неверно, пожалуйста, дайте мне знать, чтобы я мог удалить этот ответ.В этом примере я использую SQL Server 2008 R2 в качестве серверной части.Поскольку у меня нет двух серверов, я создал две идентичные таблицы в разных Schemas ServerA и ServerB .

Пошаговый процесс:

  1. В разделе Connection manager службы SSIS создайте два соединения OLE DB, а именно Сервер A и Сервер B .Этот пример указывает на один и тот же сервер, но в вашем сценарии соединения должны указывать на два разных сервера.Смотрите скриншот # 1 .

  2. Создайте две схемы ServerA и ServerB.Создайте таблицу dbo.ItemInfo в обеих схемах.Создание сценариев для этих таблиц приведено в разделе Scripts .Опять же, эти объекты только для этого примера.

  3. Я заполнил обе таблицы некоторыми примерами данных.Таблица ServerA.ItemInfo содержит 2,222 rows, а таблица ServerB.ItemInfo содержит 10,000 rows.Что касается вопроса, то недостающие строки 7,778 должны быть переведены из ServerB в ServerA.См. Снимок экрана # 2 .

  4. На вкладке потока управления пакета служб SSIS поместите задачу потока данных, как показано на снимке экрана # 3 .

  5. Дважды щелкните задачу потока данных, чтобы перейти на вкладку потока данных и настроить задачу потока данных, как описано ниже. Сервер B является OLE DB Source; Поиск записи на сервере A - это Lookup transformation task и Сервер A - это OLE DB Destination.

  6. Настройка OLE DB Source Сервер B , как показано на скриншотах # 4 и # 5 .

  7. Настройка Lookup transformation task Поиск записи на сервереA , как показано на скриншотах # 6 - # 8 .В этом примере ItemId является уникальным ключом.Следовательно, именно этот столбец используется для поиска пропущенных записей между двумя таблицами.Так как нам нужны только строки, которых нет на сервере A , нам нужно выбрать опцию Redirect rows to no match output.

  8. Поместить OLE DB Destination в данныеЗадача потока.Когда вы соединяете задачу преобразования «Уточняющий запрос» с назначением OLE DB, вам будет предложено ввести диалог Input Output Selection.Выберите Lookup No Match Output в диалоговом окне, как показано на скриншоте # 9 .Настройте OLE DB Destination Сервер A , как показано на скриншотах # 10 и # 11 .

  9. После получения данныхзадание потока настроено, оно должно выглядеть так, как показано на скриншоте # 12 .

  10. Пример выполнения пакета показан на скриншоте # 13 .Как вы можете заметить, пропавшие 7,778 rows были перенесены с Server B на Server A.Смотрите скриншот # 14 для просмотра количества записей в таблице после выполнения пакета.

  11. Поскольку требовалось просто вставить отсутствующие записи, этот подход использовался.Если вы хотите обновить существующие записи и удалить записи, которые больше не действительны, см. Пример, который я привел в этой ссылке .Службы SQL Integration Services для загрузки файла с разделителями табуляции? Пример в ссылке показывает, как передать плоский файл в SQL, но он обновляет существующие записи и удаляет недопустимые записи.Кроме того, пример точно настроен для обработки большого количества строк.

Надеюсь, это поможет.

Скрипты

.

CREATE SCHEMA [ServerA] AUTHORIZATION [dbo]
GO

CREATE SCHEMA [ServerB] AUTHORIZATION [dbo]
GO

CREATE TABLE [ServerA].[ItemInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
) ON [PRIMARY]
GO

CREATE TABLE [ServerB].[ItemInfo](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemId] [varchar](255) NOT NULL,
    [ItemName] [varchar](255) NOT NULL,
    [ItemType] [varchar](255) NOT NULL,
    CONSTRAINT [PK_ItemInfo] PRIMARY KEY CLUSTERED ([Id] ASC),
    CONSTRAINT [UK_ItemInfo_ItemId] UNIQUE NONCLUSTERED ([ItemId] ASC)
) ON [PRIMARY]
GO

Снимок экрана № 1:

1

Снимок экрана № 2:

2

Снимок экрана № 3:

3

Снимок экрана № 4:

4

Снимок экрана № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Скриншот № 8:

8

Снимок экрана № 9:

9

Снимок экрана № 10:

10

Снимок экрана № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Снимок экрана № 14:

14

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