Usuário com melhor resposta
Dúvidas sobre Querys....

Pergunta
-
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 SnippetCreate 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.
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 Snippetcreate 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 Snippetcreate 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 Snippetcreate 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 Snippetcreate 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 Snippetexec 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.
-
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.
-
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 #ResultDrop 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..
-
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 SnippetCreate 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.
-
-
-
-