Присвоєння результатів збережених процедур змінній SSIS


9

Я намагаюся отримати значення зі збереженої процедури в змінну SSIS, а потім перевіряю, чи можуть працювати дві задачі SSIS, якщо я додав вираз. Отже, для прикладу, я намагаюся використовувати цю збережену процедуру:

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

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

Ось приклад завдання:

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

А ось скріншот редактора обмежень прецеденту:

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

А ось властивості першого завдання:

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

Я хочу, щоб це йшло вперед (або не вдалося) виходячи з цієї умови. Але коли я тестую його, процес переходить від першого завдання до другого незалежно, і лише показує мені "100% завершене" для першого завдання, і нічого про те, перевіряв він це вираз як істинне чи ні. Як я можу зробити таке і що піде не так? У мене є змінна в SSIS під назвою "orderCount", щоб отримати значення зі збереженого proc.


1
У своєму першому завданні Execute SQL вам потрібно призначити висновок Збереженої процедури назад@[User::orderCount]
Марк Сінкінсон

Чи піде він десь у тому вікні? (останнє зображення я щойно додав як редагування допису)
Раві

1
Вибачте, на Result Setсторінці. simple-talk.com/sql/ssis/…
Марк Сінкінсон

Велике спасибі, що це вдалося! Він передає перше завдання і переходить до другого. Я хочу, щоб він не йшов вперед через вираз, який я встановив, намагаючись сказати "Якщо значення, передане цій змінній, менше 5, не виконуйте наступного завдання".
Раві

@Jaywant у другому завданні, спробуйте встановити вираз для властивості "Вимкнути" щось подібне @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Не забудьте опублікувати результати в цій темі, якщо це успішно. GL!
Пітер Вандів'є

Відповіді:


10

У вас є два варіанти, щоб зробити цю роботу. Або ви можете використовувати єдиний набір результатів, або можете скористатися параметром OUTPUT. Наразі ви не використовуєте належним чином.

Параметр 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 та власник місця параметра

Вкажіть також змінну, яку ви хочете зіставити, і використовуйте там напрям виходу Тут я відобразив результат у змінну SSIS типу Int32orderCount

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

Набір єдиного результату

Ви маєте першу частину цього правильного - ви вказали, що набір результатів - Один рядок.

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

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

Потім на вкладці "Набір результатів" я тут відображаю перший стовпець (нульовий порядковий) до змінної, що називається orderCountb

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

Якщо запустити надану збережену процедуру, ви не отримаєте значення в orderCountb. Чому? Тому що ви нічого не повертаєте із збереженого виклику процедури. Я додав остаточне твердження всередині збереженої процедури

SELECT @OrderCount AS OrderCount;

Зроби це сам

Ви можете дослідити будь-який підхід, використовуючи наступний бімл. Що таке бімл? Мова розмітки 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! Надзвичайно корисна публікація! Дуже дякую!
Раві
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.