Você tem duas opções para fazer isso funcionar. Você pode usar um conjunto de resultados único ou o parâmetro OUTPUT. No momento, você não está usando corretamente.
Parâmetro OUTPUT
Seu procedimento armazenado é definido como tendo um parâmetro @OrderCount
com uma direção deOUTPUT
Se você quiser usar o procedimento armazenado em uma ferramenta, SSMS, .NET, qualquer que seja, seria algo como
DECLARE @orderCount int = 0;
EXECUTE dbo.TestStoredProcSSVariable @orderCount OUTPUT;
SELECT @orderCount As OrderCountVariable;
É válido executar o OUTPUT
procedimento acima sem especificar, mas observe o valor de @orderCount. Muda de 1435 para 0.
O mesmo vale quando você estiver usando a tarefa Executar SQL no SSIS. Você deve especificar que o parâmetro esteja em OUTPUT e também na guia Mapeamentos de parâmetros.
Especifique também a variável que você deseja mapear e use a direção OUTPUT lá. Aqui mapeei o resultado em uma variável SSIS do tipo Int32 chamadaorderCount
Conjunto de resultados único
Você tem a primeira parte correta - especificou que o conjunto de resultados é Linha Única.
Você notará que estou usando, EXECUTE dbo.TestStoredProcSSVariable ?
pois você deve especificar um valor de entrada ou a chamada proc será interrompida (pelo menos como você definiu). Você poderia codificar um valor em vez de algo ?
semelhante0
Em seguida, na guia Conjunto de resultados, aqui estou mapeando a primeira coluna (zeroth ordinal) para uma variável chamada orderCountb
Se você executar o procedimento armazenado fornecido, não receberá um valor em orderCountb. Por quê? Porque você não está retornando nada da chamada de procedimento armazenado. Eu adicionei uma declaração final dentro do procedimento armazenado de
SELECT @OrderCount AS OrderCount;
Faça Você Mesmo
Você pode explorar qualquer uma das abordagens usando o seguinte biml. O que é biml? A Business Intelligence Markup Language é o sistema operacional para BI. Por que você se importa com isso é que ele permitirá transformar um pouco de XML em um pacote SSIS. Tudo o que você precisa fazer é baixar e instalar o addon BIDS Helper gratuito
Depois de instalar o BIDS Helper,
- Clique com o botão direito do mouse no projeto e selecione Adicionar novo arquivo Biml
- substitua o conteúdo do arquivo pelo seguinte XML
- Corrija os valores na linha 5. Atualize
Data Source
para um servidor real e Provider
alinhe-o com sua versão do SSIS. Olhando para a sua captura de tela, provavelmente será SQLNCLI10.1
- Clique com o botão direito do mouse em BimlScript.biml e escolha Gerar Pacotes 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>
Aproveite o seguinte pacote SSIS
@[User::orderCount]