Assegnazione dei risultati della procedura memorizzata alla variabile SSIS


9

Sto cercando di ottenere il valore da una procedura memorizzata in una variabile SSIS, quindi test per vedere se due attività SSIS possono funzionare se ho aggiunto un'espressione. Quindi, per un esempio, sto cercando di utilizzare questa procedura memorizzata:

inserisci qui la descrizione dell'immagine

Forse sto anche impostando le proprietà della variabile SSIS in modo completamente sbagliato, perché non sono sicuro se lo sto facendo nel modo giusto per importare il valore proc memorizzato in una variabile SSIS. Per favore, dimmi se hai bisogno di ulteriori screencaps di qualsiasi altra cosa.

Ecco l'esempio dell'attività:

inserisci qui la descrizione dell'immagine

Ed ecco lo screencap dell'editor dei vincoli di precedenza:

inserisci qui la descrizione dell'immagine

Ed ecco le proprietà per la prima attività:

inserisci qui la descrizione dell'immagine

Voglio che vada avanti (o fallisca) in base a quella condizione. Ma quando lo collaudo, il processo scorre dalla prima all'altra a prescindere, e mi mostra solo "100% completo" per la prima attività e nulla sul fatto che abbia verificato che questa espressione sia vera o meno. Come posso fare una cosa del genere e cosa non va? Ho una variabile in SSIS chiamata 'orderCount' per ottenere il valore da proc memorizzato.


1
Nella prima attività Esegui SQL, è necessario assegnare nuovamente l'output della Stored Procedure a@[User::orderCount]
Mark Sinkinson

Andrebbe da qualche parte in quella finestra? (ultima immagine che ho appena aggiunto come post editing)
Ravi

1
Siamo spiacenti, sulla Result Setpagina. simple-talk.com/sql/ssis/…
Mark Sinkinson,

Grazie mille, è stato così! Passa il primo compito e passa al secondo. Voglio che non vada avanti a causa dell'espressione che ho impostato cercando di dire "Se il valore passato a quella variabile è inferiore a 5, non eseguire l'attività successiva".
Ravi,

@Jaywant sulla seconda attività, prova a impostare un'espressione per la proprietà "Disabilita" in qualche modo @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Non dimenticare di inviare i risultati a questa discussione se ha esito positivo. GL!
Peter Vandivier,

Risposte:


10

Hai due scelte per farlo funzionare. È possibile utilizzare un singolo set di risultati oppure è possibile utilizzare il parametro OUTPUT. Attualmente non stai utilizzando correttamente.

Parametro OUTPUT

La procedura memorizzata viene definita come avente un parametro di @OrderCountcon una direzione diOUTPUT

Se si desidera utilizzare la procedura memorizzata all'interno di uno strumento, SSMS, .NET, qualunque cosa, sarebbe simile

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

È valido per eseguire quanto sopra senza specificare OUTPUTma guardare il valore di @orderCount. Cambia da 1435 a 0.

Lo stesso vale quando si utilizza l'attività Esegui SQL in SSIS. È necessario specificare che il parametro è su OUTPUT e anche specificarlo nella scheda Mapping parametri.

Specifica la clausola OUTPUT e il segnaposto dei parametri

Specificare anche la variabile che si desidera mappare e utilizzare la direzione OUTPUT lì. Qui ho mappato il risultato in una variabile SSIS di tipo Int32 chiamataorderCount

inserisci qui la descrizione dell'immagine

Set di risultati singolo

Hai la prima parte di questo corretto: hai specificato che il set di risultati è Riga singola.

Noterai che sto usando EXECUTE dbo.TestStoredProcSSVariable ?come devi specificare un valore di input o la chiamata proc si interromperà (almeno come l'hai definita). Avresti potuto codificare un valore al posto del ?simile0

inserisci qui la descrizione dell'immagine

Quindi, nella scheda Set di risultati, qui sto mappando la prima colonna (zeroth ordinale) su una variabile chiamata orderCountb

inserisci qui la descrizione dell'immagine

Se si esegue la stored procedure fornita, non si otterrà un valore in orderCountb. Perché? Perché non si restituisce nulla dalla chiamata della procedura memorizzata. Ho aggiunto una dichiarazione finale all'interno della stored procedure di

SELECT @OrderCount AS OrderCount;

Fallo da solo

Puoi esplorare entrambi gli approcci usando il seguente biml. Che cos'è il biml? Il Business Intelligence Markup Language è il sistema operativo per la BI. Perché ti preoccupi è che ti permetterà di trasformare un po 'di XML in un pacchetto SSIS. Tutto quello che devi fare è scaricare e installare il componente aggiuntivo gratuito BIDS Helper

Dopo aver installato BIDS Helper,

  1. Fare clic con il tasto destro sul progetto e selezionare Aggiungi nuovo file Biml
  2. sostituire il contenuto del file con il seguente XML
  3. Correggere i valori nella riga 5. Aggiornare Data Sourcea un server reale e Providerallinearlo alla versione SSIS. Guardando il tuo screenshot, questo sarà probabilmente SQLNCLI10.1
  4. Fare clic con il tasto destro su BimlScript.biml e selezionare Genera pacchetti 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>

Goditi il ​​seguente pacchetto SSIS

inserisci qui la descrizione dell'immagine


È stato incredibilmente utile e informativo, grazie mille, billinkc! Post estremamente utile! Molte grazie!
Ravi,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.