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 @OrderCount
con 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 OUTPUT
ma 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.
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
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
Quindi, nella scheda Set di risultati, qui sto mappando la prima colonna (zeroth ordinale) su una variabile chiamata orderCountb
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,
- Fare clic con il tasto destro sul progetto e selezionare Aggiungi nuovo file Biml
- sostituire il contenuto del file con il seguente XML
- Correggere i valori nella riga 5. Aggiornare
Data Source
a un server reale e Provider
allinearlo alla versione SSIS. Guardando il tuo screenshot, questo sarà probabilmente SQLNCLI10.1
- 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] < 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>
Goditi il seguente pacchetto SSIS
@[User::orderCount]