Atribuindo resultados do procedimento armazenado à variável SSIS

9

Estou tentando obter o valor de um procedimento armazenado em uma variável do SSIS e testando para ver se duas tarefas do SSIS podem funcionar se eu adicionei uma expressão. Então, por exemplo, estou tentando usar este procedimento armazenado:

insira a descrição da imagem aqui

Talvez eu esteja configurando as propriedades da variável SSIS totalmente erradas, porque também não tenho certeza se estou fazendo isso da maneira correta para que o valor do proc armazenado seja importado para uma variável SSIS. Por favor, diga-me se precisar de mais screencaps de qualquer outra coisa.

Aqui está o exemplo da tarefa:

insira a descrição da imagem aqui

E aqui está o screencap do Editor de restrições de precedência:

insira a descrição da imagem aqui

E aqui estão as propriedades para a primeira tarefa:

insira a descrição da imagem aqui

Quero que ele avance (ou falhe) com base nessa condição. Mas quando eu testo, o processo flui da primeira tarefa para a segunda independentemente, e apenas me mostra "100% concluído" para a primeira tarefa e nada sobre se a expressão foi verificada como verdadeira ou não. Como posso fazer uma coisa dessas e o que está errado? Eu tenho uma variável no SSIS chamada 'orderCount' para obter o valor do processo armazenado.

Ravi
fonte
11
Em sua primeira tarefa Executar SQL, é necessário atribuir a saída da parte de trás procedimento armazenado para@[User::orderCount]
Mark Sinkinson
Iria a algum lugar nessa janela? (última imagem que eu acabei de adicionar como um post de edição)
Ravi
11
Desculpe, na Result Setpágina. simple-talk.com/sql/ssis/...
Mark Sinkinson
Muito obrigado, foi isso! Ele passa a primeira tarefa e prossegue para a segunda. Quero que isso não ocorra devido à expressão que defini tentando dizer "Se o valor passado para essa variável for menor que 5, não execute a próxima tarefa".
Ravi
@ Jaywant na segunda tarefa, tente definir uma expressão para a propriedade "Disable" como algo semelhante @[User::orderCount]<5?(dt_bool)1:(dt_bool)0. Não se esqueça de postar resultados de volta neste tópico, se for bem-sucedido. GL!
Peter Vandivier

Respostas:

10

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 @OrderCountcom 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 OUTPUTprocedimento 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 a cláusula OUTPUT e o marcador de posição do parâmetro

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

insira a descrição da imagem aqui

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

insira a descrição da imagem aqui

Em seguida, na guia Conjunto de resultados, aqui estou mapeando a primeira coluna (zeroth ordinal) para uma variável chamada orderCountb

insira a descrição da imagem aqui

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,

  1. Clique com o botão direito do mouse no projeto e selecione Adicionar novo arquivo Biml
  2. substitua o conteúdo do arquivo pelo seguinte XML
  3. Corrija os valores na linha 5. Atualize Data Sourcepara um servidor real e Provideralinhe-o com sua versão do SSIS. Olhando para a sua captura de tela, provavelmente será SQLNCLI10.1
  4. 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] &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>

Aproveite o seguinte pacote SSIS

insira a descrição da imagem aqui

billinkc
fonte
Isso foi incrivelmente útil e informativo, muito obrigado, billinkc! Postagem extremamente útil! Muito obrigado!
Ravi