web-dev-qa-db-fra.com

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

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 :

enter image description here

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 que je le fasse 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 d'autre chose.

Voici l'exemple de tâche:

enter image description here

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

enter image description here

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

enter image description here

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 sur le fait de vérifier si 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é.

9
Ravi

Vous avez deux choix pour que cela fonctionne. Soit vous pouvez utiliser un jeu de résultats unique , soit vous pouvez 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 @OrderCount avec une direction de OUTPUT

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 OUTPUT mais 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.

Specify OUTPUT clause and parameter place holder

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ée orderCount

enter image description here

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 s'arrêtera (au moins tel que vous l'avez défini). Vous auriez pu coder en dur une valeur au lieu de ? comme 0

enter image description here

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

enter image description here

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. Tout ce que vous devez faire est 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 à la ligne 5. Mettez à jour le Data Source vers un vrai serveur et Provider pour s'aligner 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

enter image description here

10
billinkc