ストアドプロシージャからSSIS変数に値を取得し、式を追加した場合に2つのSSISタスクが機能するかどうかをテストしています。したがって、例として、thisストアドプロシージャを使用しようとしています。
おそらく、SSIS変数のプロパティを完全に間違って設定しているのかもしれません。これは、ストアドプロシージャの値をSSIS変数にインポートする正しい方法でこれを行っているかどうかもわからないためです。他に何かスクリーンキャプチャが必要かどうか教えてください。
これがタスクの例です:
そしてここに優先順位制約エディタのスクリーンキャプチャがあります:
そして、これが最初のタスクのプロパティです:
その条件に基づいて前進(または失敗)させたい。しかし、それをテストすると、プロセスは最初のタスクから2番目のタスクに関係なく流れ、最初のタスクの「100%完了」のみを表示し、この式が真かどうかをチェックしたかどうかについては何も表示しません。どうすればこのようなことができますか?ストアドプロシージャから値を取得するために、SSISに 'orderCount'という変数があります。
これを機能させるには、2つの選択肢があります。単一の結果セットまたはを使用するか、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にあることを指定し、[パラメータマッピング]タブでも指定する必要があります。
また、マップする変数を指定し、そこでOUTPUT方向を使用します。ここでは、orderCount
というInt32型のSSIS変数に結果をマッピングしました
これで正しい最初の部分ができました-結果セットが単一行であることを指定しました。
入力値を指定する必要があるのでEXECUTE dbo.TestStoredProcSSVariable ?
を使用していることに注意してください。そうしないと、(少なくとも定義したとおりに)proc呼び出しが中断します。 ?
のように、0
の代わりに値をハードコーディングすることもできます。
次に、[結果セット]タブで、最初の列(0番目の序数)をorderCountb
という変数にマッピングします。
提供されているストアドプロシージャを実行した場合、orderCountbの値は取得されません。どうして?ストアドプロシージャコールから何も返さないからです。のストアドプロシージャ内に最後のステートメントを追加しました
SELECT @OrderCount AS OrderCount;
次のbimlを使用して、どちらのアプローチも検討できます。 bimlとは何ですか?ビジネスインテリジェンスマークアップ言語は、BIのオペレーティングシステムです。気にする理由は、XMLをSSISパッケージに変換できることです。あなたがする必要があるのは、無料のアドオンをダウンロードしてインストールするだけです BIDS Helper
BIDS Helperをインストールした後、
Data Source
を実サーバーに更新し、Provider
をSSISバージョンに合わせて更新します。スクリーンショットを見ると、これはおそらくSQLNCLI10.1です。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] < 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] < 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パッケージをお楽しみください