none
Como Fazer um Update em uma tabela e um Insert em outra ao mesmo tempo RRS feed

  • Pergunta

  • Pessoa, bom dia!

    tenho a seguinte situação: tenho uma tabela chamada Medicamentos_Hospital, porem essa tabela já veio preenchida com alguns dados e alguns campos de informação do medicamento.

    criei uma segunda tabela chamada Medicamentos_Hospital_Itens. Nessa tabela ainda não consta nada, está vazia. Tenho um campo chave primaria nas duas tabelas que se relacionam 1:1.

    A questão é como faço para fazer um Update na primeira tabela, lembrando que esta tabela já consta valores e como faço para inserir alguns valores na tabela itens, lembrando essa tabela esta vazia.

    Resumindo: preciso fazer na mesma Query deduzo eu, um update e um insert em tabelas relacionadas. Parece simples mais não estou conseguindo fazer... Tambem não sei se é a melhor forma de fazer isso.

    segue meu exemplo:

    CREATE PROCEDURE [dbo].[spEstoqueAlterarMedicamentosHospital]
    
    @MED_CODI AS VARCHAR(10),
    @MED_DESC AS VARCHAR(60),
    @APR_DESC AS VARCHAR(60),
    @NUM_TISS AS VARCHAR(10),
    
    @QuantidadeTotal as int,
    @QuantidadeMinima as int,
    @TipoProduto as varchar(23),
    @DataDaAlteracao as dateTime,
    @NomeUsuario as varchar(60)
    
    AS
    BEGIN
    	BEGIN TRANSACTION		
    			UPDATE MEDICAMENTOS_HOSPITAL SET 
    			MED_CODI = @MED_CODI,
    			MED_DESC = @MED_DESC,
    			APR_DESC = @APR_DESC											
    			WHERE NUM_TISS = @NUM_TISS
    			
    			DELETE FROM MEDICAMENTOS_HOSPITAL_ITENS 
    			WHERE Num_TISS = @NUM_TISS;
    			
    			INSERT INTO MEDICAMENTOS_HOSPITAL_ITENS
    			(Num_TISS,
    			CodProduto,
    			QuantidadeTotal,
    			QuantidadeMinima,
    			TipoProduto,
    			DataDaAlteracao,
    			NomeUsuario)
    			VALUES
    			(@NUM_TISS,
    			@MED_CODI,
    			@QuantidadeTotal,
    			@QuantidadeMinima,
    			@TipoProduto,
    			@DataDaAlteracao,
    			@NomeUsuario)
    			
    	COMMIT
    END

    Conhecimento basico em sql

    Obrigado galera

    Thyago

    quinta-feira, 29 de outubro de 2015 12:54

Respostas

  • Olá Thyago Gonçalves,

    Tudo bem?

    Poderia compartilhar com o fórum a solução que encontrou e marcá-la como resposta para contribuir com a comunidade?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.


    Oi Marcos, na verdade o Thyago já postou a resposta dele, o que ele está buscando é uma forma melhor de fazer a consulta dele !


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quinta-feira, 29 de outubro de 2015 15:14

Todas as Respostas

  • Olá Thyago Gonçalves,

    Tudo bem?

    Poderia compartilhar com o fórum a solução que encontrou e marcá-la como resposta para contribuir com a comunidade?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.


    • Editado Marcos SJ quinta-feira, 29 de outubro de 2015 13:35
    quinta-feira, 29 de outubro de 2015 13:34
  • Olá Thiago,

    Uma possibilidade de se fazer isso que deseja é usar a opção OUTPUT do comando Update. Segue abaixo um exemplo utilizando trecho do seu próprio código:

    	UPDATE MEDICAMENTOS_HOSPITAL SET 
    	MED_CODI = @MED_CODI,
    	MED_DESC = @MED_DESC,
    	APR_DESC = @APR_DESC	
    	OUTPUT  @NUM_TISS,
    			@MED_CODI,
    			@QuantidadeTotal,
    			@QuantidadeMinima,
    			@TipoProduto,
    			@DataDaAlteracao,
    			@NomeUsuario	
    	INTO MEDICAMENTOS_HOSPITAL_ITENS
    	WHERE NUM_TISS = @NUM_TISS

    Nesse exemplo, no mesmo comando é feito o Update na tabela MEDICAMENTOS_HOSPITAL e é feito um Insert na tabela MEDICAMENTOS_HOSPITAL_ITENS.

    Abraço,

    Antônio Cesar





    • Editado Antonio Cesar quinta-feira, 29 de outubro de 2015 14:06
    quinta-feira, 29 de outubro de 2015 14:03
  • Olá Thyago Gonçalves,

    Tudo bem?

    Poderia compartilhar com o fórum a solução que encontrou e marcá-la como resposta para contribuir com a comunidade?

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.


    Oi Marcos, na verdade o Thyago já postou a resposta dele, o que ele está buscando é uma forma melhor de fazer a consulta dele !


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quinta-feira, 29 de outubro de 2015 15:14
  • Olá Thiago,

    Uma possibilidade de se fazer isso que deseja é usar a opção OUTPUT do comando Update. Segue abaixo um exemplo utilizando trecho do seu próprio código:

    	UPDATE MEDICAMENTOS_HOSPITAL SET 
    	MED_CODI = @MED_CODI,
    	MED_DESC = @MED_DESC,
    	APR_DESC = @APR_DESC	
    	OUTPUT  @NUM_TISS,
    			@MED_CODI,
    			@QuantidadeTotal,
    			@QuantidadeMinima,
    			@TipoProduto,
    			@DataDaAlteracao,
    			@NomeUsuario	
    	INTO MEDICAMENTOS_HOSPITAL_ITENS
    	WHERE NUM_TISS = @NUM_TISS

    Nesse exemplo, no mesmo comando é feito o Update na tabela MEDICAMENTOS_HOSPITAL e é feito um Insert na tabela MEDICAMENTOS_HOSPITAL_ITENS.

    Abraço,

    Antônio Cesar





    Antônio,

    A cláusula OUTPUT não funciona com tabelas que possuem restrições de FK, é possivel executar desabilitando as FK´s, mas o SQL identifica a falha ao tentar salvar a procedure.


    Flávio Farias
    "May the Force be with you"
    Se foi resolvido clique "Marcar como resposta" e se foi útil "Votar como Útil"

    quinta-feira, 29 de outubro de 2015 15:20
  • Boa Tarde Thyago,

    Você pode usar o MERGE do SQL Server.

    Realiza operações de inserção, atualização ou exclusão em uma tabela de destino com base nos resultados da junção com a tabela de origem. Por exemplo, você pode sincronizar duas tabelas inserindo, atualizando ou excluindo linhas em uma tabela com base nas diferenças encontradas na outra tabela.

    Exemplo:

    MERGE Production.UnitMeasure AS target
        USING (SELECT @UnitMeasureCode, @Name) AS source (UnitMeasureCode, Name)
        ON (target.UnitMeasureCode = source.UnitMeasureCode)
        WHEN MATCHED THEN 
            UPDATE SET Name = source.Name
    WHEN NOT MATCHED THEN
        INSERT (UnitMeasureCode, Name)
        VALUES (source.UnitMeasureCode, source.Name)
        OUTPUT deleted.*, $action, inserted.* INTO #MyTempTable;

    https://msdn.microsoft.com/pt-br/library/bb510625(v=sql.120).aspx

    Espero que Ajude...

    Douglas 

    quinta-feira, 29 de outubro de 2015 15:33
  • Galera obrigado pela ajuda,  não estava funcionando porque o nome da procedure esta errado no código mais ficou dessa maneira e agora esta funcionando... como eu já tinha dito não sei se é a melhor maneira de fazer mais o importante a principio é que funcionou e isso tudo é para um trabalho de faculdade e não tenho tempo hábil de fazer da melhor maneira até porque só tenho conhecimento básico e como dito agora pouco o prazo para entrega esta curtíssimo....

    obrigado a todos tela atenção e informações...

    Att.

    Thyago

    quinta-feira, 29 de outubro de 2015 15:47
  • Olá Flávio Augusto Lacerda de Farias,

    Obrigado pelo retorno.

    Thyago Gonçalves,

    Obrigado por sua colaboração com o fórum, assim como a todos os outros que colaboraram na thread.

    :)

    Atenciosamente


    Marcos Roberto de Souza Junior

    Esse conteúdo e fornecido sem garantias de qualquer tipo, seja expressa ou implícita

    MSDN Community Support

    Por favor, lembre-se de Marcar como Resposta as respostas que resolveram o seu problema. Essa e uma maneira comum de reconhecer aqueles que o ajudaram e fazer com que seja mais fácil para os outros visitantes encontrarem a resolução mais tarde.


    • Editado Marcos SJ quinta-feira, 29 de outubro de 2015 16:23
    quinta-feira, 29 de outubro de 2015 16:23
  • Flávio, boa tarde.

    Você está correto. Quando eu fiz uso da cláusula OUTPUT foi para uma tabela que não tinha FK alguma, pois era uma tabela de Log. Como para mim deu certo, achei que não teria problema. Mas olhando a documentação pude verificar que realmente existe essa restrição: Se tiver alguma FK realmente não funciona. Obrigado pela dica.

    Abraço,

    Antônio Cesar

    quinta-feira, 29 de outubro de 2015 20:26