Tienes dos opciones para hacer que esto funcione. Puede usar un Conjunto de resultados únicos o puede usar el parámetro OUTPUT. Actualmente no estás usando ninguno de los dos correctamente.
Parámetro de salida
Su procedimiento almacenado se define como tener un parámetro @OrderCount
con una dirección deOUTPUT
Si quisieras usar el procedimiento almacenado dentro de una herramienta, SSMS, .NET, lo que sea, se vería algo así
DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;
Es válido ejecutar lo anterior sin especificar, OUTPUT
pero observe el valor de @orderCount. Cambia de 1435 a 0.
Lo mismo ocurre cuando está utilizando la tarea Ejecutar SQL dentro de SSIS. Debe especificar que el parámetro está en SALIDA y también especificarlo en la pestaña Asignaciones de parámetros.
También especifique la variable que desea asignar y use la dirección de SALIDA allí. Aquí he mapeado el resultado en una variable SSIS de tipo Int32 llamadaorderCount
Conjunto de resultados únicos
Tiene la primera parte de esta correcta: ha especificado que el conjunto de resultados es Single Row.
Notarás que estoy usando EXECUTE dbo.TestStoredProcSSVariable ?
ya que debes especificar un valor de entrada o la llamada de proceso se interrumpirá (al menos como lo has definido). Podría haber codificado un valor en lugar de algo ?
similar0
Luego, en la pestaña Conjunto de resultados, aquí estoy mapeando la primera columna (ordinal cero) a una variable llamada orderCountb
Si ejecuta el procedimiento almacenado proporcionado, no obtendrá un valor en orderCountb. ¿Por qué? Porque no está devolviendo nada de la llamada al procedimiento almacenado. Agregué una declaración final dentro del procedimiento almacenado de
SELECT @OrderCount AS OrderCount;
Hazlo tu mismo
Puede explorar cualquier enfoque utilizando el siguiente biml. ¿Qué es biml? El lenguaje de marcado de Business Intelligence es el sistema operativo para BI. Lo que le importa es que le permitirá transformar algo de XML en un paquete SSIS. Todo lo que necesita hacer es descargar e instalar el complemento gratuito BIDS Helper
Después de instalar BIDS Helper,
- Haga clic derecho en el proyecto y seleccione Agregar nuevo archivo Biml
- reemplace el contenido del archivo con el siguiente XML
- Fije los valores en la línea 5. Actualice el
Data Source
a un servidor real y Provider
alinee con su versión SSIS. Mirando su captura de pantalla, probablemente sea SQLNCLI10.1
- Haga clic derecho en BimlScript.biml y elija Generar paquetes 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] < 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>
Disfruta el siguiente paquete SSIS
@[User::orderCount]