none
Impor condição na hora de utilizar o comando INSERT RRS feed

  • Pergunta

  • Tenho 2 tabelas (DATA_PRODUCAO e CONSULTA1) com campos idênticos (DATA, CODIGO, PACOTE, CORTE e OPERACAO).

    Minha dúvida é: Preciso inserir os registros que estão na tabela CONSULTA na tabela DATA_PRODUCAO, porém preciso respeitar a chave PRIMÁRIA que existe na tabela que irá receber os novos registros PK_DATA_CODIGO). Se não existir a inclusão é efetivada, caso contrário passa-se para o próximo registro. Isso se faz necessário pois existem registros identicos nas duas tabelas.

    TABELA DATA_PRODUCAO:

    TABELA CONSULTA1

     
    quinta-feira, 15 de setembro de 2022 15:00

Respostas

  • Boa tarde,

    Acho que uma alternativa para esse caso seria o uso do comando Merge.

    Outra alternativa seria executar um Insert / Select com o operador Exists (no caso not) na clausula Where para obter somente as linhas que ainda não existem na tabela de destino.

    Espero que ajude


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

    • Marcado como Resposta Marcos Emiliano sexta-feira, 16 de setembro de 2022 10:31
    quinta-feira, 15 de setembro de 2022 17:10
  • Marcos,

    Complementando a resposta do Gapimex, poderíamos pensar na utilizar do operador Not In, fazendo a mesma abordagem na tentativa de identificar os registros que nao existem com base na condição definida na cláusula where.

    Segue abaixo um exemplo do uso do comando Merge embutido dentro de uma Stored Procedure:

    -- Criando a Tabela ProdutosProduzidos --
    Create Table ProdutosProduzidos
     (OrdemProducao Varchar(20) Not Null Primary Key Clustered,
     DataProducao DateTime Not Null,
     Quantidade Int Not Null)
    On [Primary]
    Go
    
    -- Criando a Stored Procedure P_FindProduction --
    Create Procedure P_FindProduction @OrdemProducao VarChar(20), @DataProducao DateTime
    As
    Begin
    Set NoCount On;
    
    Begin Try
    
     Merge ProdutosProduzidos As Target
      Using (Select @OrdemProducao, @DataProducao) As Source (OrdemProducao, DataProducao)
       On (Target.OrdemProducao = Source.OrdemProducao 
           And Target.DataProducao = Source.DataProducao)
      When Matched Then
       Update Set Quantidade = Quantidade + 1, DataProducao = GetDate()
      When Not Matched Then
       Insert (OrdemProducao, DataProducao, Quantidade)
       Values(Source.OrdemProducao, Source.DataProducao, 1);
    
    End Try
    
    Begin Catch
      
       SELECT 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_MESSAGE() AS ErrorMessage,
            ERROR_LINE() AS ErrorLine;
             
    End Catch
    End
    Go
    
    Select * from ProdutosProduzidos
    
    Insert Into ProdutosProduzidos (OrdemProducao, DataProducao, Quantidade)
    Values (1,GetDate(),1), 
           (2,GetDate(),1),
    	   (3,GetDate(),1)
    
    
    Exec P_FindProduction 3, '2014-07-08 10:26:25.250'
    Go
    

    Ou este outro exemplo do uso do Merge aplicado diretamente em uma query:

    Create Table Loja1
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    Create Table Loja2
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    Create Table Lojas
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    
    Insert Into Loja1 Values (IsNull(@@Identity,1),'Loja 1')
    Go 20
    
    Insert Into Loja1 Values (IsNull(@@Identity,1),'Loja 2')
    Go 15
    
    Merge Lojas Destino
    Using Loja1 Origem
    On Origem.Codigo = Destino.Codigo
    When Not Matched Then
     Insert Values(CodProduto, Descricao)
    When Matched Then
     Update Set Destino.Codigo = Origem.Codigo;
    
    Merge Lojas Destino
    Using Loja2 Origem
    On Origem.Codigo = Destino.Codigo
    When Matched Then
     Update Set Destino.Descricao = 'Em ambas as lojas'
    When Not Matched Then
     Insert Values (CodProduto, Descricao);


    Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos Emiliano sexta-feira, 16 de setembro de 2022 10:32
    quinta-feira, 15 de setembro de 2022 23:13

Todas as Respostas

  • Boa tarde,

    Acho que uma alternativa para esse caso seria o uso do comando Merge.

    Outra alternativa seria executar um Insert / Select com o operador Exists (no caso not) na clausula Where para obter somente as linhas que ainda não existem na tabela de destino.

    Espero que ajude


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

    • Marcado como Resposta Marcos Emiliano sexta-feira, 16 de setembro de 2022 10:31
    quinta-feira, 15 de setembro de 2022 17:10
  • Marcos,

    Complementando a resposta do Gapimex, poderíamos pensar na utilizar do operador Not In, fazendo a mesma abordagem na tentativa de identificar os registros que nao existem com base na condição definida na cláusula where.

    Segue abaixo um exemplo do uso do comando Merge embutido dentro de uma Stored Procedure:

    -- Criando a Tabela ProdutosProduzidos --
    Create Table ProdutosProduzidos
     (OrdemProducao Varchar(20) Not Null Primary Key Clustered,
     DataProducao DateTime Not Null,
     Quantidade Int Not Null)
    On [Primary]
    Go
    
    -- Criando a Stored Procedure P_FindProduction --
    Create Procedure P_FindProduction @OrdemProducao VarChar(20), @DataProducao DateTime
    As
    Begin
    Set NoCount On;
    
    Begin Try
    
     Merge ProdutosProduzidos As Target
      Using (Select @OrdemProducao, @DataProducao) As Source (OrdemProducao, DataProducao)
       On (Target.OrdemProducao = Source.OrdemProducao 
           And Target.DataProducao = Source.DataProducao)
      When Matched Then
       Update Set Quantidade = Quantidade + 1, DataProducao = GetDate()
      When Not Matched Then
       Insert (OrdemProducao, DataProducao, Quantidade)
       Values(Source.OrdemProducao, Source.DataProducao, 1);
    
    End Try
    
    Begin Catch
      
       SELECT 
            ERROR_NUMBER() AS ErrorNumber,
            ERROR_SEVERITY() AS ErrorSeverity,
            ERROR_STATE() AS ErrorState,
            ERROR_PROCEDURE() AS ErrorProcedure,
            ERROR_MESSAGE() AS ErrorMessage,
            ERROR_LINE() AS ErrorLine;
             
    End Catch
    End
    Go
    
    Select * from ProdutosProduzidos
    
    Insert Into ProdutosProduzidos (OrdemProducao, DataProducao, Quantidade)
    Values (1,GetDate(),1), 
           (2,GetDate(),1),
    	   (3,GetDate(),1)
    
    
    Exec P_FindProduction 3, '2014-07-08 10:26:25.250'
    Go
    

    Ou este outro exemplo do uso do Merge aplicado diretamente em uma query:

    Create Table Loja1
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    Create Table Loja2
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    Create Table Lojas
    (Codigo Int Identity(1,1),
     CodProduto Int,
     Descricao Varchar(10))
    
    
    Insert Into Loja1 Values (IsNull(@@Identity,1),'Loja 1')
    Go 20
    
    Insert Into Loja1 Values (IsNull(@@Identity,1),'Loja 2')
    Go 15
    
    Merge Lojas Destino
    Using Loja1 Origem
    On Origem.Codigo = Destino.Codigo
    When Not Matched Then
     Insert Values(CodProduto, Descricao)
    When Matched Then
     Update Set Destino.Codigo = Origem.Codigo;
    
    Merge Lojas Destino
    Using Loja2 Origem
    On Origem.Codigo = Destino.Codigo
    When Matched Then
     Update Set Destino.Descricao = 'Em ambas as lojas'
    When Not Matched Then
     Insert Values (CodProduto, Descricao);


    Pedro Antonio Galvão Junior [MSc. | MVP | MCC | MSTC | MIE | MTAC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados Relacional e Data Warehouse | Professor Universitário | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    • Marcado como Resposta Marcos Emiliano sexta-feira, 16 de setembro de 2022 10:32
    quinta-feira, 15 de setembro de 2022 23:13
  • Tenho 2 tabelas (DATA_PRODUCAO e CONSULTA1) com campos idênticos (DATA, CODIGO, PACOTE, CORTE e OPERACAO).

    Minha dúvida é: Preciso inserir os registros que estão na tabela CONSULTA na tabela DATA_PRODUCAO, porém preciso respeitar a chave PRIMÁRIA que existe na tabela que irá receber os novos registros PK_DATA_CODIGO). Se não existir a inclusão é efetivada, caso contrário passa-se para o próximo registro. Isso se faz necessário pois existem registros identicos nas duas tabelas.

    TABELA DATA_PRODUCAO:

    TABELA CONSULTA1

     

    Obrigado a todos pelas sugestões. Optei pela sugestão do nosso colega gapimex. Ficou assim:

    MERGE 
        bdsic.dbo.data_producao AS Destino
    USING 
        bdsic.dbo.Consulta1 AS Origem ON (Origem.Data = Destino.Data and Origem.Codigo = Destino.Codigo)

    -- Registro existe nas 2 tabelas
    WHEN MATCHED THEN
        UPDATE SET 
            Destino.Data = Origem.Data,
            Destino.Codigo = Origem.Codigo,
            Destino.Pacote = Origem.Pacote,
            Destino.Numero_do_corte = Origem.Numero_do_corte,
    Destino.Operacao = Origem.Operacao

    -- Registro não existe no destino. Vamos inserir.
    WHEN NOT MATCHED THEN
        INSERT
        VALUES(Origem.Data, Origem.Codigo, Origem.Pacote, Origem.Numero_do_corte, Origem.Operacao);


    sexta-feira, 16 de setembro de 2022 10:31