none
Dúvidas sobre Querys.... RRS feed

  • Pergunta

  •  

    Fala Galera,
    queria saber se alguém poderia postar um codigo de como ficaria a criação de uma Proc... que tem como parametro um Id....e faz ligação com outra proc q retorne o ID e uma Desc... ? agradeço a ajuda...

    t+

    sexta-feira, 28 de novembro de 2008 01:19

Respostas

  • Olá Renato, irei comentar o que eu observei na sua sentença:

     

    1 - Na sp_proc1 vc cria uma tabela temporária chamada #resul e depois a utiliza como #result, ou seja, erro de digitação.

    2 - A sp_proc2 não está filtrando dados através do parametro repassado pela sp_proc1, isso deve ser feito para evitar que uma maior quantidade de dados seja repassada pelas procedures desnecessariamente.

    3 - Na sp_proc2 vc criou uma tabela temporária com os atributos codprod e NmProd, porém, no select vc as usa como codigo e nome.

    4 - Nas procedures 1 e 2 vc dropa as tabelas temporárias, porém, esse comando não é necessário uma vez que a mesma só fica durante a execução da proc, ou seja, ela é automaticamente dropada ao fim da execução.

    5 - Ao informar a procedure a ser executada via linked server, é aconselhavel informar todo o caminho, ex:

           EXEC LKSRV.db_Banco.dbo.PR_PROC2

    Aconselho vc a criar as procedure com nomes que não iniciem com "sp_", pois, convencionalmente esse prefixo destina-se a procedures de sistema.

     

    Segue a sua procedure com algumas alterações:

    Code Snippet

    Create proc pr_proc1 @cdservico int

    as

    declare @result table -- criei esta tabela para armazenar a consulta q vai me retornar... não sei se precisa...

    (codigo int,nome varchar(50))

    --executa o linkedserv.. chamando a proc2... e passando o parametro...

    exec lksrv.db_banco.dbo.pr_proc2

    go

    create proc pr_proc2-- proc q esta no outro db.

    @cdservico int

    as

    declare @resulta table -- criei esta tabela pensando em armazenar os dados de retorno para a proc1

    ( codigo int, nome varchar(50))

    insert into @resulta

    --chama a proc3 pelo linkedserver... que contem os dados da tabela para fazer o inner join...

    exec lnksrv.db_banco2.dbo.pr_proc3

    select fpf.codigo, fpf.nome from tb_fontesprodutosfamilia fpf (nolock)

    inner join @resulta res

    on fpf.codigo = res.codigo

    where res.codigo = @cdservico

    go

    create proc pr_proc3

    as

    select codigo, nome from tb_servicosclinicosprogramacaoproduto (nolock)

    go

     

     

    Abs, Emanuel.

     

     

     

     

    sábado, 29 de novembro de 2008 03:53

Todas as Respostas

  • Seja Bem-Vindo Renato,

    Não sei se entendí bem o que vc quer mas, aí vai, alguma coisa:

     

    Procedure 1 - será executada através de outra procedure.

    Code Snippet

    create proc procedure01 @id_proc1 int

    as

    select id,descricao from tabela where id=@id_proc1

    go

     

     

    Procedure 2 -  Essa procedure executa a procedure01 passando um valor para a procedure01.

    Code Snippet

    create proc procedure02 @id_proc2 int

    as

    exec procedure01 @id_proc1=@id_proc2

     

     

    ou seja, se vc executa:

    exec procedure02 @id_proc2=xxx, essa procedure irá esecutar a procedure01 passando o valor do id para a procedure01.

    O exemplo é bastante simples,se vc desejar acrescentar mais parâmetros, é só declarar a mesma da mesma forma que está no exemplo.

    assim:

    Code Snippet

    create proc procedure01 @id_proc1 int, @status char(1),nome varchar(20),.....

     

     

    Se desejar atribuir um valor padrão para uma parâmetro, segue um exemplo:

    Code Snippet

    create proc procedure01 @id_proc1 int=1, @status char(1)='F'

    as.......

     

    Lembrando que o recurso de vc atribuir o valor padrão no parametro só permanece se nenhum valor for declarado na hora da execução.

    por exemplo, no exemplo que passei do valor padrão, se vc executasse a procedure01 sem declarar o status com outro valor, a procedure assumirá que o status é "F", do contrário será o valor que vc passar na execução da procedure, ex:

    Code Snippet
    exec procedure01 @status='U'

    O exemplo acima, passa "U" como valor do status, se vc executar a procedure01 omitindo o parametro status, a procedure executa assumindo-a como "F":

     

     

    Espero ter contribuído.

     

     se v espero que esse tenha sido a sua dúvida.

     

     

    sexta-feira, 28 de novembro de 2008 02:06
  • Renato,

     

    Inicialmente gostaria de dar as boas vindas, esperamos poder ajudar da melhor forma possível de acordo com o nosso conhecimento e disponibilidade, faça parte desta grande comunidade, ajudando com o seu conhecimento.

     

    Em relação a sua dúvida, os exemplos que Emanuel postou com certeza poderam ajudar, agora se você quiser mais exemplos acesse o Books On-Line.

    sexta-feira, 28 de novembro de 2008 10:04
  • Ola Emanuel.. grato pela atenção...

     

    Cara, estou precisando pela primeira vez utilizar 3 Procs e usar 2 bancos para uma consulta... esse é o problema...

    preciso que a proc1 me retorne um cod e desc.. de acordo com  o parametro @cod...

    Esta proc1 vai chamar a Proc2 via linkedserver e passando como Parametro o mesmo @cod...

    A Proc2 vai chamar via linkedserver a Proc 3, na qual a Proc3 é um select simples da tabela para fazer um inner join...

    então, eu fiz o codigo assim... mas creio q esta errado... segue:

     

    CREATE PROC SP_PROC1

     @CDServico int

    as

    create table #Resul   -- criei esta tabela para armazenar a consulta q vai me retornar... não sei se precisa...
    (
     CodProd  int,
     NmProd  varchar(50)
    )

    INSERT INTO #Result
    --executa o linkedserv.. chamando a PROC2... e passando o parametro...

     EXEC LKSRV.db_Banco.SP_PROC2


    Select * from #Result

    Drop table #Result

     

    --------------------------------------------------------------------------------------

     

    Create PROC SP_PROC2-- Proc q esta no outro DB.

     @CDServico int

    AS

    CREATE TABLE #RESULTA -- criei esta tabela pensando em armazenar os dados de retorno para a PROC1
    (
     CODPROD  INT,

     NmProd      Varchar(50)
    )

    INSERT #RESULTA
    --chama a PROC3 pelo linkedserver... que contem os dados da tabela para fazer o inner join...

    exec LNKSRV.db_Banco2.SP_PROC3


    SELECT  FPF.Codigo, FPF.Nome FROM tb_FontesProdutosFamilia FPF (NOLOCK)
    INNER JOIN #RESULTA RES  (NOLOCK)
    ON FPF.Codigo = RES.Codigo


    DROP TABLE #RESULTA

     

    --------------------------------------------------------------------------------------


    CREATE PROC SP_PROC3
    as


    select Codigo, nome from tb_ServicosClinicosProgramacaoProduto (NOLOCK)

    go

     

     

    Cara se puder me manda uma luz agradeço..

    Leve em consideração a lógica do processo... se vc entendeu..

     

    grato,

     

    Ren@to..

    sexta-feira, 28 de novembro de 2008 23:34
  • Olá Renato, irei comentar o que eu observei na sua sentença:

     

    1 - Na sp_proc1 vc cria uma tabela temporária chamada #resul e depois a utiliza como #result, ou seja, erro de digitação.

    2 - A sp_proc2 não está filtrando dados através do parametro repassado pela sp_proc1, isso deve ser feito para evitar que uma maior quantidade de dados seja repassada pelas procedures desnecessariamente.

    3 - Na sp_proc2 vc criou uma tabela temporária com os atributos codprod e NmProd, porém, no select vc as usa como codigo e nome.

    4 - Nas procedures 1 e 2 vc dropa as tabelas temporárias, porém, esse comando não é necessário uma vez que a mesma só fica durante a execução da proc, ou seja, ela é automaticamente dropada ao fim da execução.

    5 - Ao informar a procedure a ser executada via linked server, é aconselhavel informar todo o caminho, ex:

           EXEC LKSRV.db_Banco.dbo.PR_PROC2

    Aconselho vc a criar as procedure com nomes que não iniciem com "sp_", pois, convencionalmente esse prefixo destina-se a procedures de sistema.

     

    Segue a sua procedure com algumas alterações:

    Code Snippet

    Create proc pr_proc1 @cdservico int

    as

    declare @result table -- criei esta tabela para armazenar a consulta q vai me retornar... não sei se precisa...

    (codigo int,nome varchar(50))

    --executa o linkedserv.. chamando a proc2... e passando o parametro...

    exec lksrv.db_banco.dbo.pr_proc2

    go

    create proc pr_proc2-- proc q esta no outro db.

    @cdservico int

    as

    declare @resulta table -- criei esta tabela pensando em armazenar os dados de retorno para a proc1

    ( codigo int, nome varchar(50))

    insert into @resulta

    --chama a proc3 pelo linkedserver... que contem os dados da tabela para fazer o inner join...

    exec lnksrv.db_banco2.dbo.pr_proc3

    select fpf.codigo, fpf.nome from tb_fontesprodutosfamilia fpf (nolock)

    inner join @resulta res

    on fpf.codigo = res.codigo

    where res.codigo = @cdservico

    go

    create proc pr_proc3

    as

    select codigo, nome from tb_servicosclinicosprogramacaoproduto (nolock)

    go

     

     

    Abs, Emanuel.

     

     

     

     

    sábado, 29 de novembro de 2008 03:53
  • Olá Emanuel,

    Grato pela atenção... e agradeço os comentário, dicas... etc...

     

    Eu fiz algumas alterações e pareçe que vai funcionar....

    Qualquer, eu posto novamente... Ok..

     

     

    Grato,

     

     

    Renato.

    sábado, 29 de novembro de 2008 10:34
  • Olá Renato, vc conseguiu?

    sexta-feira, 5 de dezembro de 2008 02:09
  • Sim cara, consegui...

    Eu percebi que na primeiro proc eu não precisava da tabela temporaria...

    agradeço pela ajuda e atenção..

     

    att..

     

     

    Renato Cavalcanti

     

    sexta-feira, 5 de dezembro de 2008 22:49
  • Renato, quando possível, favor classificar a resposta.

    Valeu!
    sexta-feira, 5 de dezembro de 2008 23:05