Как перейти к следующей задаче, только если для данного запроса нет записей? - PullRequest
3 голосов
/ 02 сентября 2011

У меня есть следующий фрагмент SQL, который проверит, существуют ли какие-либо дубликаты записей. Как я могу проверить, не возвращены ли записи? Я использую это в пакете служб SSIS. Я хочу, чтобы он переходил к следующему шагу, если нет записей, в противном случае ошибка.

SELECT      Number
        ,   COUNT(Number) AS DuplicateCheckresult
FROM        [TelephoneNumberManagement].[dbo].[Number]
GROUP BY    Number
HAVING      COUNT(Number) > 1

Ответы [ 2 ]

16 голосов
/ 03 сентября 2011

Следующий пример, созданный с использованием 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 .

Variable

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

Connection Manager

На вкладке «Поток управления» служб 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.

Execute SQL Task General

Enter SQL Query

Execute SQL Task Result Set

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

Control Flow tab

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

Щелкните правой кнопкой мыши ограничение приоритета и выберите Edit...

Edit

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

Precedence Constraint

Test

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

Constraint

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

Table data

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

Execution 1

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

TRUNCATE TABLE dbo.Phone;

INSERT INTO dbo.Phone (Number) VALUES 
    (1234567890),
    (0987654321);

Теперь данные в таблице, как показано ниже.

Non-duplicate data

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

Execution 2

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

0 голосов
/ 02 сентября 2011

Что вам нужно сделать, это работать с @@ROWCOUNT, но то, как вы это сделаете, зависит от ваших потоков данных. Посмотрите на это обсуждение, в котором указано, как это сделать с одним или двумя потоками данных.

Использование подсчета строк в SSIS

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