Usuário com melhor resposta
Update com referencia na segunda tabela, agrupar soma da segunda tabela

Pergunta
-
Boa noite,
Estou precisando fazer um update com tabela relacionada
preciso pegar o resultado da consulta abaixo e atualizar outra tabela
SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA,
SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP
INNER JOIN TBL_OB_CADOBRAS OBR ON(OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS)
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
ORDER BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATAJa tentei diversas formas mas nao tive sucesso.
Grato pela ajuda.
Mário Sergio
Respostas
-
Davi,
E um bom caminho.
******
Apenas o Select funcionar, esta me retornando 47 registros
SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT******
Bom executei conforme abaixo:
CREATE PROCEDURE PRC_INSERTORUPDATE
(
@CODOBRA INT = NULL,
@OBRA VARCHAR(100) = NULL,
@NR_PEDIDO INT = NULL,
@DATA DATETIME = NULL,
@VALORPAGO DECIMAL(10,2) = NULL
)
AS
BEGIN
DECLARE @VALOR DECIMAL(10,2)
SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT
EXECUTE PRC_INSERORUPDATE()Retornou erro:
Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 19
Incorrect syntax near ')'.
-
Maseroli,
Quando a sua procedure, esta faltando um END no final para a mesma ser compilada.
CREATE PROCEDURE PRC_INSERTORUPDATE ( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN DECLARE @VALOR DECIMAL(10,2) SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) As GT END
Alem de que, isso é uma procedure e não uma função, então sua execução não possui um (), então sua execução deve ser:
EXECUTE PRC_INSERTORUPDATE --+ os parametros via @Parametro = 'Valor'
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta Maseroli segunda-feira, 15 de abril de 2013 19:21
Todas as Respostas
-
-
José, obrigado pela ajuda!
E a segunda opçao, preciso atualizar, eu ja inseri os registros importado de um CSV, agora preciso atualizar o valores com uma segunda importaçao do mesmo arquivo.
Vou fazer testes com seu exemplo e posto o resultado em seguida.
Obrigado por equanto
-
José Bom dia!
Seu codigo funcionou perfeitamente fico muito agradecido.
tem alguma maneira de incluir no mesmo codigo, caso exista atualiza o registro se não incluir o registro.
With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as
(SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
)
update Ob_Faturamento
set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
from ATUALIZACOES as ATU inner join Ob_Faturamento as OT
on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)Att,
Mário Sergio
-
Maseroli,
Qual a versão do teu SQL Server? A partir do SQL 2008 existe a cláusula MERGE, onde você faz justamente essa verificação e inserção / atualização dos teus dados.
Dê uma olhada nesse link, pode te ajudar: http://technet.microsoft.com/en-us/library/bb510625(v=sql.100).aspx
[]'s
-
Somente para complementar esse post , nesse ultimo caso Maseroli creio que a solução seria procedures
pois nelas você colocaria a lógica da programação ideal escolhendo INSERT OU UPDATE ex :
CREATE PROCEDURE PRC_INSERTORUPDATE( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA ) DECLARE @VALOR DECIMAL(10,2) = (SELECT VALORPAGO FROM ATUALIZACOES) IF(@VALOR = 0 OR @VALOR IS NULL) --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure ELSE update Ob_Faturamento set Ob_Faturamento.FATVALOR = ATU.VALORPAGO from ATUALIZACOES as ATU inner join Ob_Faturamento as OT on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO) END
-- Para Chama-la
EXECUTE PRC_INSERTORUPDATE()
-- OU
EXECUTE PRC_INSERORUPDATE(valor1,valor2,valor3,...)
Levando em consideração que Valor Pago só retorna um valor.
Espero ter ajudado
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
Davi, bom dia!
Obrigado pela sua ajuda, porem estou com dificuldades de entender ainda como trabalhar com procedures
uso SQL 2012 R2
me retornou um erro
Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 113
Incorrect syntax near the keyword 'DECLARE'.
Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 119
Incorrect syntax near the keyword 'ELSE'.
Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 129
Incorrect syntax near ')'.Grato,
Mário Sergio
-
Bom dia , então copiar e colar o código que postei não vai funcionar logo de cara mesmo , tem que haver algumas mudanças e é claro entender como funciona procedures. Façamos o seguinte post seu código com a implementação que você tentou fazer , para podermos ir ajustando conforme a sua necessidade.
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
Mude seu código para isso :
CREATE PROCEDURE PRC_INSERTORUPDATE( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT) IF(@VALOR = 0 OR @VALOR IS NULL) --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure ELSE ;With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA ) update Ob_Faturamento set Ob_Faturamento.FATVALOR = ATU.VALORPAGO from ATUALIZACOES as ATU inner join Ob_Faturamento as OT on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO) END -- Para Chama-la EXECUTE PRC_INSERTORUPDATE() -- OU EXECUTE PRC_INSERORUPDATE(valor1,valor2,valor3,...)
Espero ter ajudado
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br- Editado Davi Murilo segunda-feira, 15 de abril de 2013 15:37
-
Davi, boa tarde!
Esta dando erro abaixo
Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 112
Incorrect syntax near the keyword 'ELSE'.
Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 129
Incorrect syntax near ')'.Esta quase dando certo.
Obrigado
Mário Sergio
-
Vamos mais uma vez tente isso agora :
CREATE PROCEDURE PRC_INSERTORUPDATE( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT) IF(@VALOR = 0 OR @VALOR IS NULL) --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure ELSE BEGIN ;With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA ) update Ob_Faturamento set Ob_Faturamento.FATVALOR = ATU.VALORPAGO from ATUALIZACOES as ATU inner join Ob_Faturamento as OT on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO) END END -- Para Chama-la EXECUTE PRC_INSERTORUPDATE() -- OU EXECUTE PRC_INSERORUPDATE(valor1,valor2,valor3,...)
Ou seja após o ELSE coloquei BEGIN e END.
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
Davi,
Ainda não deu, segue resultado abaixo
Server: Msg 156, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 115
Incorrect syntax near the keyword 'ELSE'.
Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 133
Incorrect syntax near ')'.Att,
Mário Sergio
-
Mas meu amigo você deve colocar alguma coisa no bloco do IF . Como no exemplo seria o INSERT entendeu ?
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
-
Ok Fico no aguardo. Só uma dica não leve meu exemplo ao pé da letra pois o que será inserido de fato ? Os parametros que coloquei são apenas simbolicos de dados que você de fato iria usar exemplo no meu código é como se eu fosse inserir os dados :
@CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL
Em alguma tabela que esteja esperando isso suponhamos que fosse para as tabelas : tbl_Ob_ImportarFaturamentoTemporario e TBL_OB_CADOBRAS seria algum assim :
CREATE PROCEDURE PRC_INSERTORUPDATE( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT) IF(@VALOR = 0 OR @VALOR IS NULL) BEGIN -- Acrescento o BEGIN e END pois terá mais de uma execução no bloco INSERT INTO tbl_Od_ImportarFaturamentoTemporario(ValorPago) VALUES (@VALORPAGO) INSERT INTO TBL_OB_CADOBRAS(codobra,obra,nr_pedido,data) VALUES(@CODOBRA,@OBRA,@NR_PEDIDO,@DATA) END ELSE BEGIN ;With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA ) update Ob_Faturamento set Ob_Faturamento.FATVALOR = ATU.VALORPAGO from ATUALIZACOES as ATU inner join Ob_Faturamento as OT on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO) END END -- Para Chama-la exemplo : EXECUTE PRC_INSERTORUPDATE 3,'CASA',10,GETDATE(),1500.50
Espero ter ajudado.
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br- Editado Davi Murilo segunda-feira, 15 de abril de 2013 17:39
-
Davi,
Bom vou contar um pouco da historia do que eu espero acontecer.
Eu tenho uma tabela chamada "tbl_Ob_ImportarFaturamentoTemporario" que recebe uma importação de um arquivo CSV.
em seguida preciso atualizar ou incluir na tabela "Ob_Faturamento" porem o relacionamento entre as duas tabelas ( "tbl_Ob_ImportarFaturamentoTemporario" e "Ob_Faturamento" ) e a tabela "TBL_OB_CADOBRAS"
Na tabela "tbl_Ob_ImportarFaturamentoTemporario" e carregado muitos registro, preciso agrupar
Se o registro existir atualiza, não existe então insere o registro.
Fiz algumas alterações no seu codigo mas esta dando um erro que nao consegui corrigir.
segue o codigo e o erro abaixo.
CREATE PROCEDURE PRC_INSERTORUPDATE(
@CODOBRA INT = NULL,
@OBRA VARCHAR(100) = NULL,
@NR_PEDIDO INT = NULL,
@DATA DATETIME = NULL,
@VALORPAGO DECIMAL(10,2) = NULL
)
AS
BEGIN
DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT)
IF(@VALOR = 0 OR @VALOR IS NULL)
--- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure
INSERT INTO Ob_Faturamento
(CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao )
(
SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT'
FROM tbl_Ob_ImportarFaturamentoTemporario GRU
LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)
)
ELSE
BEGIN
With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as
(SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
)
update Ob_Faturamento
set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
from ATUALIZACOES as ATU inner join Ob_Faturamento as OT
on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)
END
END
-- Para Chama-la
EXECUTE PRC_INSERTORUPDATE()Erro
Server: Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 138
Incorrect syntax near ')'. -
Tente apenas tirar os parenteses desse Select :
INSERT INTO Ob_Faturamento (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao ) ( SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT' FROM tbl_Ob_ImportarFaturamentoTemporario GRU LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido) )
Deixando o Assim :
INSERT INTO Ob_Faturamento (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao ) SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT' FROM tbl_Ob_ImportarFaturamentoTemporario GRU LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)
Detalhe para o seu caso o que o Logan disse sobre MERGE faz todo sentido e é melhor opção , caso essa de criar procedures esteja sendo difícil.
Pode -se até ter o MERGE dentro de uma procedure .
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br
- Editado Davi Murilo segunda-feira, 15 de abril de 2013 18:00
-
Davi,
E removi os parenteses do select mas ainda nao deu certo.
Erro:
Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 45
Incorrect syntax near ')'.Eu preferia resover com seu codigo, pois achei muito interessante e pode me ajudar bastante no futuro.
Att,
Mário Sergio
-
Coloque BEGIN e END no If também só para ter certeza, como no penultimo exemplo que te passei onde tem 2 inserts lá eu coloquei BEGIN e END
tente isso.
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br -
Davi,
Parece que so falta um pequeno detalhe que nao estamos conseguindo identificar, inclui o BEGIN E END conforme sua orientaçao, porem nao deu muito resultado
CREATE PROCEDURE PRC_INSERTORUPDATE
(
@CODOBRA INT = NULL,
@OBRA VARCHAR(100) = NULL,
@NR_PEDIDO INT = NULL,
@DATA DATETIME = NULL,
@VALORPAGO DECIMAL(10,2) = NULL
)
AS
BEGIN
DECLARE @VALOR DECIMAL(10,2) = (SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT)
IF
(@VALOR = 0 OR @VALOR IS NULL)
BEGIN
--- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure
INSERT INTO Ob_Faturamento
(CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao )
SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT'
FROM tbl_Ob_ImportarFaturamentoTemporario GRU
LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido)
END
ELSE
BEGIN
With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as
(SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA
)
update Ob_Faturamento
set Ob_Faturamento.FATVALOR = ATU.VALORPAGO
from ATUALIZACOES as ATU inner join Ob_Faturamento as OT
on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO)
END
END
-- Para Chama-la
EXECUTE PRC_INSERORUPDATE()Erro:
Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 49
Incorrect syntax near ')'.
-
Então meu amigo vamos Debugar a Proc
Faça isso :
CREATE PROCEDURE PRC_INSERTORUPDATE ( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN DECLARE @VALOR DECIMAL(10,2) SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT /* IF (@VALOR = 0 OR @VALOR IS NULL) BEGIN --- INSERT INTO Ob_Faturamento Aqui vai sua inserção com os parametros da procedure INSERT INTO Ob_Faturamento (CODOBRA, CAMPO1, FATNRPEDIDO, DATARECPEDIDO, FATVALOR, FATTIPO, UsuarioCadastra, DataCadastra, Observacao ) SELECT GRU.CODOBRA, GRU.OBRA, GRU.NR_PEDIDO, GRU.DATA, GRU.VALORPAGOUPRAS, '342', 'MARIO', '2011-01-01', 'INSERT' FROM tbl_Ob_ImportarFaturamentoTemporario GRU LEFT join Obra_Faturamento fat on(fat.codobra = GRU.codobra and fat.fatnrpedido = gru.nr_pedido) END ELSE BEGIN With ATUALIZACOES (CODOBRA, OBRA, NR_PEDIDO, DATA, VALORPAGO) as (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA ) update Ob_Faturamento set Ob_Faturamento.FATVALOR = ATU.VALORPAGO from ATUALIZACOES as ATU inner join Ob_Faturamento as OT on (OT.CODOBRA = ATU.CODOBRA AND OT.FATNRPEDIDO = ATU.NR_PEDIDO) END */ END
Veremos o que retorna o seu Select , aguardo retorno.]
Não esqueça de executar isso :
EXECUTE PRC_INSERORUPDATE
ou
EXECUTE PRC_INSERORUPDATE NULL,NULL,NULL,NULL,NULL
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br
- Editado Davi Murilo segunda-feira, 15 de abril de 2013 18:45
-
Davi,
E um bom caminho.
******
Apenas o Select funcionar, esta me retornando 47 registros
SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT******
Bom executei conforme abaixo:
CREATE PROCEDURE PRC_INSERTORUPDATE
(
@CODOBRA INT = NULL,
@OBRA VARCHAR(100) = NULL,
@NR_PEDIDO INT = NULL,
@DATA DATETIME = NULL,
@VALORPAGO DECIMAL(10,2) = NULL
)
AS
BEGIN
DECLARE @VALOR DECIMAL(10,2)
SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO
FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN
TBL_OB_CADOBRAS OBR ON (OBR.NROBRA COLLATE Latin1_General_CI_AS = TMP.OBRA COLLATE Latin1_General_CI_AS )
GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) AS GT
EXECUTE PRC_INSERORUPDATE()Retornou erro:
Msg 102, Level 15, State 1, Procedure PRC_INSERTORUPDATE, Line 19
Incorrect syntax near ')'.
-
Revise seu código deve ter BEGIN e END , não vejo o END
Outro detalhe e dica após colocar o END , Só selecione a estrutura da procedure e dê f5 , Depois selecione apenas a chamada EXECUTE PRC_INSERTORUPDATE
e também dê F5. Detalhe não use parenteses na chamada , apenas o EXECUTE PRC_INSERTORUPDATE , sem nada na frente.
No Retorno
Davi Murilo Referência Principal : Jesus que ilumina minha mente.
Referência Profissonal : http://www.tidm.com.br- Editado Davi Murilo segunda-feira, 15 de abril de 2013 18:50
-
Maseroli,
Quando a sua procedure, esta faltando um END no final para a mesma ser compilada.
CREATE PROCEDURE PRC_INSERTORUPDATE ( @CODOBRA INT = NULL, @OBRA VARCHAR(100) = NULL, @NR_PEDIDO INT = NULL, @DATA DATETIME = NULL, @VALORPAGO DECIMAL(10,2) = NULL ) AS BEGIN DECLARE @VALOR DECIMAL(10,2) SELECT GT.PAGO FROM (SELECT OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA, SUM(TMP.VALORPAGO) AS PAGO FROM tbl_Ob_ImportarFaturamentoTemporario TMP INNER JOIN TBL_OB_CADOBRAS OBR ON (OBR.NROBRA = TMP.OBRA COLLATE Latin1_General_CI_AS ) GROUP BY OBR.CODOBRA, TMP.OBRA, TMP.NR_PEDIDO, TMP.DATA) As GT END
Alem de que, isso é uma procedure e não uma função, então sua execução não possui um (), então sua execução deve ser:
EXECUTE PRC_INSERTORUPDATE --+ os parametros via @Parametro = 'Valor'
Fabrizzio A. Caputo
MCT
Certificações:
Oracle OCA 11g
MCITP SQL Server 2008 Implementation and Maintenance
MCITP SQL Server 2008 Developer
ITIL V3 Foundation
Blog Pessoal: www.fabrizziocaputo.wordpress.com
Email: fabrizzio.antoniaci@gmail.com- Marcado como Resposta Maseroli segunda-feira, 15 de abril de 2013 19:21
-
-