none
Store Procedure RRS feed

  • Pergunta

  • Olá,

    Preciso  criar uma store procedure com a seguinte estrutura:

    - 1º) Faço um select com parametros - até aqui OK 

    - 2º) Pegar esse select do passo 1 e relacionar com uma outra tabela - aqui não sei como fazer 


    Obs: Não posso fazer o relacionamento no mesmo SQL, tenho que dividir nessa ordem porque no passo 2 vou exibir todos os registro e no passo 1 vou exibir so os que tiverem registros de acordo com os parametros

    Obrigado

    Charbel

    terça-feira, 3 de setembro de 2013 13:25

Respostas

Todas as Respostas

  • Olá,

    Se seu retorno da primeira consulta vai ter vários registros de retorno você pode utilizar CURSOR.

    Link: http://technet.microsoft.com/pt-br/library/ms180169.aspx

    Ex:

    Declare @id int

    Declare @nome varchar(50)

    declare cr_pessoa cursor local for

    select id, nome, from tbPessoa

    open cr_pessoa

    fetch next from cr_pessoa

    into @id, @nome

    while @@fetch_status = 0

    begin

    begin

    select * from tbEndereço where idPessoa = @id

    end

    fetch next from cr_pessoa

    into @id, @nome

    end

    close cr_pessoa

    deallocate cr_pessoa

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012



    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    • Sugerido como Resposta Roberto Galvão terça-feira, 3 de setembro de 2013 13:34
    terça-feira, 3 de setembro de 2013 13:33
  • Bom dia,

    Charbel, acredito que talvez seja possível obter o resultado desejado utilizando CTE:

    http://www.codeproject.com/Articles/275645/CTE-In-SQL-Server

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    • Marcado como Resposta CharbelDaia terça-feira, 3 de setembro de 2013 14:12
    terça-feira, 3 de setembro de 2013 13:41
  • Olá,

    Você também pode utilizar CTE.

    Ex:

    WITH pessoa_CTE (id, nome)
    AS
    (
        SELECT id, nome
        FROM tbPessoa
        WHERE data_inclusao between '2013-08-01' and '2013-09-01'
    )

    select *
    from tbEndereco as e
    inner join tbpessoa as p on p.id = e.idpessoa

    "Se a resposta foi útil, não esqueça de marcar a resposta."

    Roberto Galvão

    MCITP - Administration SQL Server 2008
    MCITP - Developer SQL Server 2008
    MCSA - SQL Server 2012


    Roberto Galvão | MCTS | MCITP | Microsoft Partner |

    • Sugerido como Resposta Roberto Galvão terça-feira, 3 de setembro de 2013 13:43
    • Marcado como Resposta CharbelDaia terça-feira, 3 de setembro de 2013 14:12
    terça-feira, 3 de setembro de 2013 13:43
  • Obrigado,

    usei CTE so mais uma duvida existe alguma contra indicação para o uso de CTE? pois vou criar diversas SP no banco e vou precisar usar esse recurso.

    att,

    Charbel

    Segue Ex :

    ainda esta incompleto mas vão ser todos + - assim:

    ALTER PROCEDURE [dbo].[A] @data datetime
    as BEGIN 

    WITH analiseVenda 
    AS
    (
        SELECT *
    FROM         dbo.ANALISE_VENDA_PRODUTO
    WHERE     (DATA = CONVERT(DATETIME, @data, 102))
    )


    SELECT     dbo.PRODUTO.CODIGO, SUM(analiseVenda.QTDE) AS QTDE
    FROM         analiseVenda RIGHT OUTER JOIN
                          dbo.PRODUTO ON analiseVenda.ID_PRODUTO = dbo.PRODUTO.ID_PRODUTO
    GROUP BY dbo.PRODUTO.CODIGO

    END 
    terça-feira, 3 de setembro de 2013 14:16
  • Charbel,

    Acho que a CTE pode ser utilizada sem problemas quando for necessária, mas acho que ela não é necessária nesse exemplo que você postou. Acho que você conseguiria obter o mesmo resultado da seguinte forma:

    SELECT p.CODIGO, SUM(a.QTDE) AS QTDE
    FROM dbo.PRODUTO as p 
    LEFT OUTER JOIN dbo.ANALISE_VENDA_PRODUTO as a
        ON a.ID_PRODUTO = p.ID_PRODUTO
    WHERE a.DATA = CONVERT(DATETIME, @data, 102)
    GROUP BY p.CODIGO
    

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 3 de setembro de 2013 15:10
  • Da forma que vc citou não da certo porque tenho que exibir todos os registro da Tab Produto e da Tab Analise de Venda somente quando tiver venda , então se eu colocar o filtro na tabela Analise de venda , mesmo tendo RIGHT OUTER JOIN ele nao mostra todos os registro da tabProduto, por isso eu tive essa necessidade de fazer o filtro antes de relacionar

    Obrigado

    Charbel

    terça-feira, 3 de setembro de 2013 16:39
  • Segue outra sugestão para teste e comparativo em relação a alternativa com CTE:

    SELECT p.CODIGO, SUM(a.QTDE) AS QTDE
    FROM dbo.PRODUTO as p 
    LEFT OUTER JOIN dbo.ANALISE_VENDA_PRODUTO as a
        ON 
            a.ID_PRODUTO = p.ID_PRODUTO and
            a.DATA = CONVERT(DATETIME, @data, 102)
    GROUP BY p.CODIGO

    Espero que seja útil.


    Assinatura: http://www.imoveisemexposicao.com.br

    terça-feira, 3 de setembro de 2013 17:32
  • Não deu certo!

    Continuando o raciocinio da CTE, acrecentei um crosstab para trasnformar linhas em colunas fiz o seguinte:

    ALTER PROCEDURE [dbo].[A] 
    as BEGIN 

    Declare @strSQL varchar(7000) 

    SET @strSQL = 'WITH analiseVenda 
    AS
    (
        SELECT *
    FROM         dbo.ANALISE_VENDA_PRODUTO
    )
    SELECT    analiseVenda.DATA, dbo.PRODUTO.CODIGO, SUM(analiseVenda.QTDE) AS QTDE
    FROM         analiseVenda RIGHT OUTER JOIN
                          dbo.PRODUTO ON analiseVenda.ID_PRODUTO = dbo.PRODUTO.ID_PRODUTO
    GROUP BY analiseVenda.DATA, dbo.PRODUTO.CODIGO'

    EXEC CrossTab
    @strSQL,
    'DATA',
    'SUM(QTDE)[]',
    'CODIGO'

    END

    EXEC A 

    vc ve algum erro de sintaxe? ele diz o seguinte 

    Mensagem 156, Nível 15, Estado 1, Linha 2
    Sintaxe incorreta próxima à palavra-chave 'WITH'.
    Mensagem 319, Nível 15, Estado 1, Linha 2
    Sintaxe incorreta próxima à palavra-chave 'with'. Se esta instrução for uma expressão de tabela comum, uma cláusula xmlnamespaces ou uma cláusula de contexto de controle de alterações, a instrução anterior deverá terminar com ponto-e-vírgula.
    Mensagem 102, Nível 15, Estado 1, Linha 12
    Sintaxe incorreta próxima a ')'.
    Mensagem 156, Nível 15, Estado 1, Linha 2
    Sintaxe incorreta próxima à palavra-chave 'WITH'.
    Mensagem 319, Nível 15, Estado 1, Linha 2
    Sintaxe incorreta próxima à palavra-chave 'with'. Se esta instrução for uma expressão de tabela comum, uma cláusula xmlnamespaces ou uma cláusula de contexto de controle de alterações, a instrução anterior deverá terminar com ponto-e-vírgula.
    Mensagem 102, Nível 15, Estado 1, Linha 12
    Sintaxe incorreta próxima a ')'.

    terça-feira, 3 de setembro de 2013 18:33
  • Desculpe a curiosidade, mas não deu certo por que?

    Sobre o erro, experimente adicionar o ponto e vírgula antes do With como sugere a mensagem de erro:

    SET @strSQL = ';WITH analiseVenda -- ...

    Espero que ajude.


    Assinatura: http://www.imoveisemexposicao.com.br


    • Editado gapimex terça-feira, 3 de setembro de 2013 19:41
    terça-feira, 3 de setembro de 2013 19:40