Присвоение результатов хранимой процедуры переменной SSIS

9

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

введите описание изображения здесь

Может быть, я даже неправильно настраиваю свойства переменной SSIS, потому что я также не уверен, правильно ли я делаю это для импорта сохраненного значения proc в переменную SSIS. Пожалуйста, скажите мне, если вам нужно больше скриншотов чего-либо еще.

Вот пример задачи:

введите описание изображения здесь

А вот сценарий Precedence Constraint Editor:

введите описание изображения здесь

А вот свойства для первой задачи:

введите описание изображения здесь

Я хочу, чтобы это пошло вперед (или провалилось) в зависимости от этого условия. Но когда я проверяю его, процесс переходит от первой задачи ко второй независимо и показывает только «100% выполнено» для первой задачи и ничего о том, проверил ли он это выражение как истинное или нет. Как я могу сделать такую ​​вещь и что идет не так? У меня есть переменная в SSIS под названием 'orderCount', чтобы получить значение из хранимой процедуры.

Ravi
источник
1
В вашей первой задаче «Выполнение SQL» вам необходимо назначить вывод хранимой процедуры обратно@[User::orderCount]
Mark Sinkinson
Пойдет ли это где-нибудь в этом окне? (последнее изображение, которое я только что добавил как редактирование сообщения)
Ravi
1
Извините, на Result Setстранице. simple-talk.com/sql/ssis/…
Марк Синкинсон
Большое спасибо, что сделал это! Он проходит первое задание и переходит ко второму. Я хочу, чтобы это не продолжалось из-за выражения, которое я задал, пытаясь сказать: «Если значение, переданное этой переменной, меньше 5, не выполняйте следующую задачу».
Рави
@Jaywant для второй задачи, попробуйте установить выражение для свойства «Отключить» что-то вроде @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Не забудьте опубликовать результаты обратно в эту ветку, если они успешны. GL!
Питер Вандивье

Ответы:

10

У вас есть два варианта сделать эту работу. Либо вы можете использовать один набор результатов, либо вы можете использовать параметр OUTPUT. Вы в настоящее время используете ни правильно.

Выходной параметр

Ваша хранимая процедура определяется как имеющая параметр @OrderCountс направлениемOUTPUT

Если вы хотите использовать хранимую процедуру в инструменте, SSMS, .NET, что угодно, это будет выглядеть примерно так

DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;

Это верно для запуска вышеупомянутого без указания, OUTPUTно посмотрите на значение @orderCount. Изменяется с 1435 до 0.

То же самое верно, когда вы используете задачу «Выполнение SQL» в службах SSIS. Необходимо указать, что параметр находится в OUTPUT, а также указать его на вкладке «Сопоставления параметров».

Укажите предложение OUTPUT и заполнитель параметра

Также укажите переменную, которую вы хотите отобразить, и используйте там направление OUTPUT. Здесь я отобразил результат в переменную SSIS типа Int32 с именемorderCount

введите описание изображения здесь

Единый набор результатов

У вас есть первая часть этого правильного - вы указали, что набор результатов является одной строкой.

Вы заметите, что я использую, EXECUTE dbo.TestStoredProcSSVariable ?поскольку вы должны указать входное значение, иначе вызов proc прервется (по крайней мере, так, как вы его определили). Вы могли бы жестко закодировать значение вместо ?подобного0

введите описание изображения здесь

Затем на вкладке «Набор результатов» я сопоставляю первый столбец (нулевой порядковый номер) с переменной orderCountb

введите описание изображения здесь

Если вы запустите предоставленную хранимую процедуру, вы не получите значение в orderCountb. Почему? Потому что вы ничего не возвращаете из вызова хранимой процедуры. Я добавил заключительное утверждение внутри хранимой процедуры

SELECT @OrderCount AS OrderCount;

Сделай сам

Вы можете исследовать любой подход, используя следующий biml. Что такое BIML? Язык разметки Business Intelligence является операционной системой для BI. Почему вы заботитесь об этом, так это о том, что он позволит вам преобразовать некоторый XML в пакет служб SSIS. Все, что вам нужно сделать, это загрузить и установить бесплатный аддон BIDS Helper

После установки BIDS Helper,

  1. Щелкните правой кнопкой мыши по проекту и выберите «Добавить новый файл Biml».
  2. замените содержимое файла следующим XML
  3. Исправьте значения в строке 5. Обновите Data Sourceсервер Providerдо реального сервера и приведите в соответствие с вашей версией SSIS. Глядя на ваш скриншот, скорее всего, это будет SQLNCLI10.1
  4. Щелкните правой кнопкой мыши на BimlScript.biml и выберите «Создать пакеты служб SSIS».

Bimlscript.biml

<Biml xmlns="http://schemas.varigence.com/biml.xsd">
    <Connections>
        <Connection
            Name="tempdb"
            ConnectionString="Data Source=.\dev2014;Initial Catalog=tempdb;Provider=SQLNCLI11.1;Integrated Security=SSPI;"
            />
    </Connections>
    <Packages>
        <Package
            Name="dba_114775"
            ConstraintMode="Linear"
        >
            <Tasks>
                <ExecuteSQL
                    ConnectionName="tempdb"
                    Name="SQL Make procedure">
                    <DirectInput>
                        <![CDATA[IF EXISTS
(
    SELECT
        *
    FROM
        sys.procedures AS P 
        INNER JOIN 
            sys.schemas AS S
            ON S.schema_id = P.schema_id
    WHERE
        S.name = 'dbo'
        AND P.name = 'TestStoredProcSSVariable'
)
BEGIN
    DROP PROCEDURE dbo.TestStoredProcSSVariable
END
GO
CREATE PROCEDURE dbo.TestStoredProcSSVariable
(
    @OrderCount int OUTPUT
)
AS
BEGIN
    SET NOCOUNT ON;

    SET @OrderCount = 1135;
    SELECT @OrderCount AS OrderCount;
END

GO

]]>
                    </DirectInput>

                </ExecuteSQL>
                <Container Name="SEQC Result set" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              ResultSet="SingleRow"
                              Name="SQL SingleRow">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ?;</DirectInput>
                            <Results>
                                <Result VariableName="User.orderCountb" Name="0" />
                            </Results>
                            <Parameters>
                                <Parameter DataType="Int32" VariableName="User.orderCountb" Name="0" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>
                    </Tasks>
                </Container>
                <Container Name="SEQC Output Parameter" ConstraintMode="Linear">
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SQL Make procedure.Output"></Input>
                        </Inputs>
                    </PrecedenceConstraints>
                    <Tasks>
                        <ExecuteSQL
                              ConnectionName="tempdb"
                              Name="SQL Output parameter">
                            <DirectInput>EXECUTE dbo.TestStoredProcSSVariable ? OUTPUT;</DirectInput>
                            <Parameters>
                                <Parameter 
                                    DataType="Int32" 
                                    VariableName="User.orderCount" 
                                    Name="0" 
                                    Direction="Output" />
                            </Parameters>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                            <DirectInput>SELECT 1;</DirectInput>
                        </ExecuteSQL>
                        <ExecuteSQL ConnectionName="tempdb" Name="Execute SQL Task 2">
                            <DirectInput>SELECT 1;</DirectInput>
                            <PrecedenceConstraints>
                                <Inputs>
                                    <Input 
                                        OutputPathName="SQL Placeholder.Output" 
                                        EvaluationOperation="ExpressionAndConstraint" 
                                        EvaluationValue="Success" 
                                        Expression="@[orderCount] &lt; 5" />
                                </Inputs>
                            </PrecedenceConstraints>
                        </ExecuteSQL>

                    </Tasks>
                </Container>
                <ExecuteSQL ConnectionName="tempdb" Name="SQL Placeholder">
                    <DirectInput>SELECT 1;</DirectInput>
                    <PrecedenceConstraints>
                        <Inputs>
                            <Input OutputPathName="SEQC Result set.Output" />
                            <Input OutputPathName="SEQC Output Parameter.Output" />
                        </Inputs>
                    </PrecedenceConstraints>
                </ExecuteSQL>
            </Tasks>
            <Variables>
                <Variable DataType="Int32" Name="orderCount">-1</Variable>
                <Variable DataType="Int32" Name="orderCountb">-1</Variable>
            </Variables>
        </Package>
    </Packages>
</Biml>

Наслаждайтесь следующим пакетом служб SSIS

введите описание изображения здесь

billinkc
источник
Это было невероятно полезно и информативно, большое спасибо, billinkc! Чрезвычайно полезный пост! Большое спасибо!
Рави