Asignación de resultados de procedimientos almacenados a la variable SSIS

9

Intento obtener el valor de un procedimiento almacenado en una variable SSIS, y luego pruebo para ver si dos tareas de SSIS pueden funcionar si agregué una expresión. Entonces, por ejemplo, estoy tratando de usar este procedimiento almacenado:

ingrese la descripción de la imagen aquí

Tal vez incluso estoy configurando las propiedades de la variable SSIS completamente incorrecta, porque tampoco estoy seguro de si estoy haciendo esto de la manera correcta para que el valor de proceso almacenado se importe a una variable SSIS. Por favor, dígame si necesita más capturas de pantalla de cualquier otra cosa.

Aquí está el ejemplo de la tarea:

ingrese la descripción de la imagen aquí

Y aquí está la captura de pantalla del Editor de restricciones de precedencia:

ingrese la descripción de la imagen aquí

Y aquí están las propiedades para la primera tarea:

ingrese la descripción de la imagen aquí

Quiero que avance (o falle) en función de esa condición. Pero cuando lo pruebo, el proceso fluye de la primera tarea a la segunda independientemente, y solo me muestra "100% completado" para la primera tarea y nada sobre si verificó que esta expresión sea verdadera o no. ¿Cómo puedo hacer tal cosa y qué está yendo mal? Tengo una variable en SSIS llamada 'orderCount' para obtener el valor del proceso almacenado.

Ravi
fuente
1
En su primera tarea Ejecutar SQL, es necesario asignar la salida de la parte posterior procedimiento almacenado a@[User::orderCount]
Marcos Sinkinson
¿Iría a alguna parte de esa ventana? (última imagen que acabo de agregar como una edición posterior)
Ravi
1
Lo siento, en la Result Setpágina. simple-talk.com/sql/ssis/…
Mark Sinkinson
Muchas gracias, eso lo hizo! Pasa la primera tarea y pasa a la segunda. Quiero que no siga adelante debido a la expresión que configuré tratando de decir "Si el valor pasado a esa variable es menor que 5, no haga la siguiente tarea".
Ravi
@Jaywant en la segunda tarea, intente establecer una expresión para la propiedad "Deshabilitar" algo como @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. No olvide publicar los resultados en este hilo si es exitoso. GL!
Peter Vandivier

Respuestas:

10

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 @OrderCountcon 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, OUTPUTpero 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.

Especificar cláusula OUTPUT y marcador de posición de parámetro

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

ingrese la descripción de la imagen aquí

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

ingrese la descripción de la imagen aquí

Luego, en la pestaña Conjunto de resultados, aquí estoy mapeando la primera columna (ordinal cero) a una variable llamada orderCountb

ingrese la descripción de la imagen aquí

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,

  1. Haga clic derecho en el proyecto y seleccione Agregar nuevo archivo Biml
  2. reemplace el contenido del archivo con el siguiente XML
  3. Fije los valores en la línea 5. Actualice el Data Sourcea un servidor real y Provideralinee con su versión SSIS. Mirando su captura de pantalla, probablemente sea SQLNCLI10.1
  4. 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] &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>

Disfruta el siguiente paquete SSIS

ingrese la descripción de la imagen aquí

billinkc
fuente
Eso fue increíblemente útil e informativo, muchas gracias, billinkc! Publicación extremadamente útil! ¡Muchas gracias!
Ravi