Следующий пример, созданный с использованием SSIS 2008 R2
и SQL Server 2008 R2
бэкэнда, иллюстрирует, как вы можете выполнить свои требования в пакете служб SSIS.
Создайте таблицу с именем dbo.Phone
и заполните ее несколькими записями, которые будут возвращать повторяющиеся результаты..
CREATE TABLE [dbo].[Phone](
[Number] [int] NOT NULL
) ON [PRIMARY]
GO
INSERT INTO dbo.Phone (Number) VALUES
(1234567890),
(1234567890);
GO
Вам необходимо немного изменить запрос, чтобы он возвращал общее количество дубликатов вместо дублированных строк.Этот запрос приведет только к одному значению (скалярному значению), которое может быть либо нулевым, либо ненулевым значением, в зависимости от того, найдены дубликаты или нет.Этот запрос мы будем использовать в задаче «Выполнение SQL» пакета SSIS.
SELECT COUNT(Number) AS Duplicates
FROM
(
SELECT Number
, COUNT(Number) AS NumberCount
FROM dbo.Phone
GROUP BY Number
HAVING COUNT(Number) > 1
) T1
В пакете служб SSIS создайте переменную с именем DuplicatesCount
типа данных Int32 .

В пакете служб SSIS создайте диспетчер соединений OLE DB для подключения к базе данных SQL Server.Я назвал его SQLServer .

На вкладке «Поток управления» служб SSIS поместите пакет «Выполнение SQL» и настройте его, как показано ниже.на скриншотах.Задача должна принять одно значение строки и присвоить его новой создаваемой переменной.Установите ResultSet
в один ряд.Установите для параметра «Соединение» значение SQLServer
, а для параметра SQLStatement - значение SELECT COUNT(Number) AS Duplicates FROM (SELECT Number, COUNT(Number) AS NumberCount FROM dbo.Phone GROUP BY Number HAVING COUNT(Number) > 1) T1
.
. В разделе «Набор результатов» нажмите кнопку Добавить и задайте для имени результата значение 0
.Присвойте переменную User::DuplicatesCount
имени результата.Затем нажмите OK.



Поместите еще одну задачу после задачи «Выполнение SQL».Я выбрал Foreach Loop Container для образца.Соедините задачи, как показано ниже.

Теперь необходимо, чтобы дубликатов не было, что означает, что выходное значение запроса в задаче «Выполнение SQL» равно нулю,затем пакет должен перейти к контейнеру цикла Foreach.В противном случае пакет не должен переходить в контейнер цикла Foreach.Для этого нам нужно добавить выражение в ограничение приоритета (зеленая стрелка между задачами).
Щелкните правой кнопкой мыши ограничение приоритета и выберите Edit...

В редакторе ограничений Precedence выберите Expression
в раскрывающемся списке Операция оценки.Установите выражение на @[User::DuplicatesCount] == 0
, чтобы проверить, что переменная DuplicatesCount
содержит значение ноль .Нулевое значение означает, что в таблице не было дубликатов dbo.Phone
.Проверьте выражение, чтобы убедиться, что синтаксис правильный.Нажмите кнопку ОК, чтобы закрыть подтверждающее сообщение.Нажмите кнопку ОК, чтобы закрыть ограничение приоритета.


Теперь поток управления должен выглядеть следующим образом.Ограничение приоритета будет обозначено fx , что означает наличие ограничения / выражения на месте.

Давайте проверим строки в таблице dbo.Phone
.Как видите, значение 1234567890
существует дважды.Это означает, что есть повторяющиеся строки и контейнер цикла Foreach не должен выполняться.

Давайте выполним пакет.Вы можете заметить, что задача «Выполнение SQL» выполнена успешно, но она не перешла к контейнеру цикла по каждому элементу.Это потому, что переменная DuplicatesCount содержит значение 1, и мы написали условие, чтобы проверить, что значение должно быть нулевым, чтобы перейти к контейнеру цикла Foreach.

Давайте удалим строкииз таблицы dbo.Phone и заполните ее неповторяющимися строками, используя следующий скрипт:
TRUNCATE TABLE dbo.Phone;
INSERT INTO dbo.Phone (Number) VALUES
(1234567890),
(0987654321);
Теперь данные в таблице, как показано ниже.

Если мы выполним пакет, он перейдет к контейнеру цикла по каждому элементу, поскольку в таблице нет повторяющихся строк dbo.Phone

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