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 @OrderCount
avec 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, 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éeorderCount
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
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;
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,
- Faites un clic droit sur le projet et sélectionnez Ajouter un nouveau fichier Biml
- remplacer le contenu du fichier par le XML suivant
- Fixez les valeurs dans la ligne 5. Mettez
Data Source
à jour le sur un vrai serveur et Provider
alignez-le sur votre version SSIS. En regardant votre capture d'écran, ce sera probablement SQLNCLI10.1
- 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] < 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
@[User::orderCount]