web-dev-qa-db-ja.com

ストアドプロシージャの結果をSSIS変数に割り当てる

ストアドプロシージャからSSIS変数に値を取得し、式を追加した場合に2つのSSISタスクが機能するかどうかをテストしています。したがって、例として、thisストアドプロシージャを使用しようとしています。

enter image description here

おそらく、SSIS変数のプロパティを完全に間違って設定しているのかもしれません。これは、ストアドプロシージャの値をSSIS変数にインポートする正しい方法でこれを行っているかどうかもわからないためです。他に何かスクリーンキャプチャが必要かどうか教えてください。

これがタスクの例です:

enter image description here

そしてここに優先順位制約エディタのスクリーンキャプチャがあります:

enter image description here

そして、これが最初のタスクのプロパティです:

enter image description here

その条件に基づいて前進(または失敗)させたい。しかし、それをテストすると、プロセスは最初のタスクから2番目のタスクに関係なく流れ、最初のタスクの「100%完了」のみを表示し、この式が真かどうかをチェックしたかどうかについては何も表示しません。どうすればこのようなことができますか?ストアドプロシージャから値を取得するために、SSISに 'orderCount'という変数があります。

9
Ravi

これを機能させるには、2つの選択肢があります。単一の結果セットまたはを使用するか、OUTPUTパラメータを使用できます。現在、どちらも正しく使用していません。

OUTPUTパラメーター

ストアドプロシージャは、OUTPUTの方向を持つ@OrderCountのパラメーターを持つものとして定義されています。

ツール、SSMS、.NETなどでストアドプロシージャを使用したい場合は、次のようになります。

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

OUTPUTを指定せずに上記を実行することは有効ですが、@ orderCountの値を確認してください。 1435から0に変わります。

SSIS内でSQL実行タスクを使用している場合も同様です。パラメータがOUTPUTにあることを指定し、[パラメータマッピング]タブでも指定する必要があります。

Specify OUTPUT clause and parameter place holder

また、マップする変数を指定し、そこでOUTPUT方向を使用します。ここでは、orderCountというInt32型のSSIS変数に結果をマッピングしました

enter image description here

単一の結果セット

これで正しい最初の部分ができました-結果セットが単一行であることを指定しました。

入力値を指定する必要があるのでEXECUTE dbo.TestStoredProcSSVariable ?を使用していることに注意してください。そうしないと、(少なくとも定義したとおりに)proc呼び出しが中断します。 ?のように、0の代わりに値をハードコーディングすることもできます。

enter image description here

次に、[結果セット]タブで、最初の列(0番目の序数)をorderCountbという変数にマッピングします。

enter image description here

提供されているストアドプロシージャを実行した場合、orderCountbの値は取得されません。どうして?ストアドプロシージャコールから何も返さないからです。のストアドプロシージャ内に最後のステートメントを追加しました

SELECT @OrderCount AS OrderCount;

自分でやれ

次のbimlを使用して、どちらのアプローチも検討できます。 bimlとは何ですか?ビジネスインテリジェンスマークアップ言語は、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パッケージをお楽しみください

enter image description here

10
billinkc