我试图将存储过程中的值获取到 SSIS 变量中,然后测试以查看如果我添加了表达式,两个 SSIS 任务是否可以工作。所以举个例子,我试图使用这个存储过程:
也许我什至完全错误地设置了 SSIS 变量属性,因为我也不确定我是否以正确的方式将存储的 proc 值导入到 SSIS 变量中。如果您还需要其他任何屏幕截图,请告诉我。
这是任务示例:
这是优先约束编辑器屏幕截图:
这是第一个任务的属性:
我希望它根据这种情况前进(或失败)。但是当我测试它时,不管怎样,过程都会从第一个任务流向第二个任务,并且只向我显示第一个任务的“100% 完成”,而没有关于它是否检查这个表达式是否为真。我怎么能做这样的事情,出了什么问题?我在 SSIS 中有一个名为“orderCount”的变量,用于从存储过程中获取值。
bil*_*nkc 11
您有两种选择来完成这项工作。您可以使用单个结果集,也可以使用 OUTPUT 参数。您目前没有正确使用。
您的存储过程被定义为具有@OrderCount
一个方向为OUTPUT
如果您想在工具、SSMS、.NET 等中使用存储过程,它看起来像
DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;
Run Code Online (Sandbox Code Playgroud)
在不指定的情况下运行上述内容是有效的,OUTPUT
但查看@orderCount 的值。它从 1435 变为 0。
在 SSIS 中使用“执行 SQL 任务”时也是如此。您必须指定该参数位于 OUTPUT 上,并在 Parameter mappings 选项卡中指定它。
还要指定要映射的变量并在那里使用 OUTPUT 方向。在这里,我将结果映射到一个名为 Int32 的 SSIS 变量中orderCount
你有正确的第一部分 - 你已经指定结果集是单行。
您会注意到我正在使用,EXECUTE dbo.TestStoredProcSSVariable ?
因为您必须指定一个输入值,否则 proc 调用将中断(至少在您定义它时)。你可以硬编码一个值来代替?
类似的0
然后,在“结果集”选项卡上,我将第一列(第零序数)映射到名为的变量 orderCountb
如果您运行提供的存储过程,您将不会在 orderCountb 中获得值。为什么?因为您没有从存储过程调用中返回任何内容。我在存储过程中添加了最后的语句
SELECT @OrderCount AS OrderCount;
Run Code Online (Sandbox Code Playgroud)
您可以使用以下 biml 探索任一方法。什么是biml?商业智能标记语言是 BI 的操作系统。您关心它的原因是它允许您将一些 XML 转换为 SSIS 包。您需要做的就是下载并安装免费插件BIDS Helper
安装 BIDS Helper 后,
Data Source
到真实服务器并Provider
与您的 SSIS 版本保持一致。查看您的屏幕截图,这可能是 SQLNCLI10.1脚本文件
<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>
Run Code Online (Sandbox Code Playgroud)
享受以下 SSIS 包
归档时间: |
|
查看次数: |
22718 次 |
最近记录: |