Affectation des résultats des procédures stockées à la variable SSIS

9

J'essaie d'obtenir la valeur d'une procédure stockée dans une variable SSIS, puis de tester pour voir si deux tâches SSIS peuvent fonctionner si j'ajoute une expression. Donc, pour un exemple, j'essaie d'utiliser cette procédure stockée:

entrez la description de l'image ici

Peut-être que je configure même les propriétés de la variable SSIS de manière totalement incorrecte, car je ne suis pas sûr non plus si je fais cela de la bonne manière pour que la valeur de proc stockée soit importée dans une variable SSIS. S'il vous plaît, dites-moi si vous avez besoin de plus de captures d'écran de quoi que ce soit d'autre.

Voici l'exemple de tâche:

entrez la description de l'image ici

Et voici le screencap de l'éditeur de contraintes de précédence:

entrez la description de l'image ici

Et voici les propriétés de la première tâche:

entrez la description de l'image ici

Je veux qu'il avance (ou échoue) en fonction de cette condition. Mais quand je le teste, le processus passe de la première tâche à la seconde, et ne me montre que "100% terminé" pour la première tâche et rien pour savoir s'il a vérifié que cette expression est vraie ou non. Comment puis-je faire une telle chose et qu'est-ce qui ne va pas? J'ai une variable dans SSIS appelée 'orderCount' pour obtenir la valeur du proc stocké.

Ravi
la source
1
Dans votre première tâche d'exécution SQL, vous devez attribuer la sortie de la procédure stockée à@[User::orderCount]
Mark Sinkinson
Cela irait-il quelque part dans cette fenêtre? (dernière image que je viens d'ajouter en tant que post-édition)
Ravi
1
Désolé, sur la Result Setpage. simple-talk.com/sql/ssis/…
Mark Sinkinson
Merci beaucoup, ça y est! Il passe la première tâche et passe à la seconde. Je veux que ça ne marche pas à cause de l'expression que j'ai définie en essayant de dire "Si la valeur passée à cette variable est inférieure à 5, ne faites pas la tâche suivante".
Ravi
@Jaywant sur la deuxième tâche, essayez de définir une expression pour la propriété "Désactiver" quelque chose comme @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. N'oubliez pas de poster les résultats sur ce sujet en cas de succès. GL!
Peter Vandivier

Réponses:

10

Vous avez deux choix pour que cela fonctionne. Vous pouvez soit utiliser un jeu de résultats unique, soit utiliser le paramètre OUTPUT. Vous n'utilisez actuellement ni l'un ni l'autre correctement.

Paramètre OUTPUT

Votre procédure stockée est définie comme ayant un paramètre de @OrderCountavec une direction deOUTPUT

Si vous vouliez utiliser la procédure stockée dans un outil, SSMS, .NET, peu importe, cela ressemblerait à quelque chose comme

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

Il est valide d'exécuter ce qui précède sans spécifier, OUTPUTmais regardez la valeur de @orderCount. Il passe de 1435 à 0.

Il en va de même lorsque vous utilisez la tâche d'exécution SQL dans SSIS. Vous devez spécifier que le paramètre est sur OUTPUT et également le spécifier dans l'onglet Mappages de paramètres.

Spécifiez la clause OUTPUT et l'espace réservé au paramètre

Spécifiez également la variable que vous souhaitez mapper et utilisez la direction OUTPUT à cet endroit. Ici, j'ai mappé le résultat dans une variable SSIS de type Int32 appeléeorderCount

entrez la description de l'image ici

Ensemble de résultats unique

Vous avez la première partie de ce correct - vous avez spécifié que le jeu de résultats est Single Row.

Vous remarquerez que j'utilise EXECUTE dbo.TestStoredProcSSVariable ?car vous devez spécifier une valeur d'entrée ou l'appel proc se cassera (au moins tel que vous l'avez défini). Vous auriez pu coder en dur une valeur au lieu de ?similaire0

entrez la description de l'image ici

Ensuite, dans l'onglet Jeu de résultats, ici, je mappe la première colonne (ordinal nul) à une variable appelée orderCountb

entrez la description de l'image ici

Si vous exécutez la procédure stockée fournie, vous n'obtiendrez pas de valeur dans orderCountb. Pourquoi? Parce que vous ne renvoyez rien de l'appel de procédure stockée. J'ai ajouté une déclaration finale dans la procédure stockée de

SELECT @OrderCount AS OrderCount;

Fais le toi-même

Vous pouvez explorer l'une ou l'autre approche en utilisant le biml suivant. Qu'est-ce que le biml? Le langage de balisage de Business Intelligence est le système d'exploitation pour BI. Ce qui vous intéresse, c'est qu'il vous permettra de transformer du XML en un package SSIS. Il vous suffit de télécharger et d'installer l'addon gratuit BIDS Helper

Après avoir installé BIDS Helper,

  1. Faites un clic droit sur le projet et sélectionnez Ajouter un nouveau fichier Biml
  2. remplacer le contenu du fichier par le XML suivant
  3. Fixez les valeurs dans la ligne 5. Mettez Data Sourceà jour le sur un vrai serveur et Provideralignez-le sur votre version SSIS. En regardant votre capture d'écran, ce sera probablement SQLNCLI10.1
  4. Faites un clic droit sur BimlScript.biml et choisissez Générer des packages 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>

Profitez du package SSIS suivant

entrez la description de l'image ici

billinkc
la source
C'était incroyablement utile et instructif, merci beaucoup, billinkc! Article extrêmement utile! Merci beaucoup!
Ravi