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 :
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:
Et voici le screencap de l'éditeur de contraintes de précédence:
Et voici les propriétés de la première tâche:
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é.
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.
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.
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
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
Ensuite, dans l'onglet Jeu de résultats, ici, je mappe la première colonne (ordinal nul) à une variable appelée orderCountb
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;
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,
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.1Bimlscript.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>
Profitez du package SSIS suivant