none
Verificar Dados antes Inserir (Resolvido) RRS feed

  • Pergunta

  • Pessoal bom dia, precisarei a ajuda de vc,s se possível.

    Tenho que inserir um dado no banco mais antes preciso verificar se ja existe ou não.

    Por exemplo:

    Tenho um grupo de empresa, neste grupo tem 10 empresas 1,2,3,4,5,6......, preciso inserir este dado por exemplo o centro de custo mais na empresa 1 ja tem e na 3 também, como este campo não pode haver duplicado ele para insert, gostaria de ajuda para criar algo que ele verificasse neste grupo de empresas especifico e inclui-se este centro de custo nas empresas que não tem o centro de custo.

    Fazer direto o SQL mesmo.

    Será que alguém poderia me ajudar ?

    Muito Obrigado.


    • Editado AndreLPTI terça-feira, 17 de maio de 2011 19:01
    quarta-feira, 11 de maio de 2011 14:24

Respostas

  • Então André, neste caso, se for usar o Not Exists, a tabela do Insert deve estar dentro do Not Exists.

    Ex.:

    INSERT INTO CentrosCusto ([EmpresaId],[Nome],[Ativo],[Descricao])
    SELECT E.Id,'00021598',1,'SAO PAULO'
    FROM
      Empresas E INNER JOIN Divisoes D ON E.DivisaoId = D.Id
                            INNER JOIN Corporacoes C ON D.CorporacaoId = C.Id
    WHERE
      (C.Id = 18) and
      (NOT EXISTS (SELECT
                     CC.EmpresaId
                   FROM
                     CentrosCusto CC
                   Where
                     (CC.EmpresaId = E.Id)))

    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta AndreLPTI terça-feira, 17 de maio de 2011 19:00
    terça-feira, 17 de maio de 2011 15:40

Todas as Respostas

  • Andre,

     

    Em relação a insert, basta cria uma constraint PK, ou se o mesmo não for obrigatorio, uma constraint unique, lembrando que NULL <> NULL, creio voce esteja se referindo ao update não? caso seja alterado por exemplo o centro de custo de uma empresa, uma trigger deveria verificar se aquele centro ja existe ou não, em caso negativo, realiza o update, caso positivo, é retornado uma menssagem de erro correto?


    Oracle OCA11g, MCC 2011!
    quarta-feira, 11 de maio de 2011 14:56
    Moderador
  • Andre,

    Apesar de me parecer simples o que precisa, fiquei meio confuso com o enunciado da questão.

    Contudo, segue o seguinte exemplo:
      A tabela @TabelaEmpresa possui uma lista de 10 empresas.
      A tabela @TabelaEmpresa_CentroCusto já tem duas empresas cadastradas, com um determinado "centro de custo".
      O Insert irá cadastrar somente as "outras" empresas (que ainda não estão cadastradas), colocando um outro "centro de custo" para elas. Uma das possíveis maneiras, é com o "not exists".
      
    Verifique por favor se é isso que precisa.
     
    Set NoCount On
     
    Declare @TabelaEmpresa Table (CodEmpresa int)
    Insert Into @TabelaEmpresa values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
     
    Declare @TabelaEmpresa_CentroCusto Table (CodEmpresa int, DescriacaoCentroCusto VarChar(10))
    Insert Into @TabelaEmpresa_CentroCusto Values (1, 'AAA'), (4, 'AAA')
     
    Insert Into @TabelaEmpresa_CentroCusto
    Select
      TE.CodEmpresa,
      'BBB'
    From
      @TabelaEmpresa TE
    Where
      (not Exists(Select
                    *
                  From
                    @TabelaEmpresa_CentroCusto TECC
                  Where
                    (TECC.CodEmpresa = TE.CodEmpresa)))
     
    Select * From @TabelaEmpresa_CentroCusto
     
    Set NoCount Off


    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 11 de maio de 2011 15:33
  • Andre,

    Você pode criar uma solução prática com o comando MERGE. Acredito que você conseguirá verificar se o dado existe ou não e tomar a melhor ação para cada caso.

     

    Abraço


    Erickson Ricci SQL Server DBA @ BB Mapfre Email: ericksonfabricio@gmail.com Blog: ericksonricci.wordpress.com Twitter: @EricksonRicci TS: Microsoft SQL Server 2008, Database Development TS: Microsoft SQL Server 2008, Implementation and Maintenance TS: Microsoft SQL Server 2005, Implementation and Maintenance
    quarta-feira, 11 de maio de 2011 15:50
  • André,

     

    caso voce esteja utilizando o Sql Server 2008, voce pode obter o mesmo resultado do Robson com o comando MERGE.

     

     Declare @TabelaEmpresa Table (CodEmpresa int)
     Insert Into @TabelaEmpresa values (1), (2), (3), (4), (5), (6), (7), (8), (9), (10)
     
     Declare @TabelaEmpresa_CentroCusto Table (CodEmpresa int, DescriacaoCentroCusto VarChar(10))
     Insert Into @TabelaEmpresa_CentroCusto Values (1, 'AAA'), (4, 'AAA')
     
      
     MERGE @TabelaEmpresa_CentroCusto AS DESTINO
     USING @TabelaEmpresa AS ORIGEM
     ON DESTINO.CodEmpresa = ORIGEM.CodEmpresa
     
     WHEN NOT MATCHED
     THEN INSERT (CodEmpresa,DescriacaoCentroCusto)   values (Origem.CodEmpresa,'CCC');

     Select * From @TabelaEmpresa_CentroCusto


    Andressa Martins Twitter: @Dre_Martins Blog: sqlgo.wordpress.com
    quarta-feira, 11 de maio de 2011 15:52
  • Pessoal esqueci de mandar um exemplo do insert basico de como é a estrutura que tenho, vou ver se com os exemplos acima eu consiga fazer.

    Obrigado.

    INSERT INTO CentrosCusto

    ([EmpresaId],[Nome],[Ativo],[Descricao])

    SELECT 

    E.Id

    ,'00019967'

    ,1

    ,'TESTE'

    FROM Empresas E 

    INNER JOIN Divisoes D ON E.DivisaoId = D.Id

    INNER JOIN Corporacoes C ON D.CorporacaoId = C.Id

    WHERE C.Id = 18

    quarta-feira, 11 de maio de 2011 17:36
  • Exatamente, Andre. Você consegue fazer este Insert com o Not Exists, como falei. Ou, como a Andressa mencionou, se estiver usando o SQL 2008, pode usar o Merge.
    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    quarta-feira, 11 de maio de 2011 21:37
  • Pessoal bom dia !!!

    Estou tentando fazer do jeito que passaram mais esta dando erro o nome da tabela esta certo e os campos também, poderiam me ajudar ?

    Segue como fiz, E o abaixo o erro.

    Muito obrigado.

     

    INSERT INTO CentrosCusto

     ([EmpresaId],[Nome],[Ativo],[Descricao])

    SELECT E.Id,'00021598',1,'SAO PAULO'

    FROM Empresas E

    WHERE NOT EXISTS (SELECT *

       FROM Empresas E 

     INNER JOIN Divisoes D ON E.DivisaoId = D.Id

     INNER JOIN Corporacoes C ON D.CorporacaoId = C.Id

       WHERE C.Id = 18)

     

     

    Mensagem 6522, Nível 16, Estado 1, Procedimento UpdateHistorico_CentrosCusto, Linha 1

    A .NET Framework error occurred during execution of user-defined routine or aggregate "UpdateHistorico_CentrosCusto": 

    System.ArgumentException: Nâo foi possivel resolver o nome da tabela. Verifique se a coluna 'EX_' com o nome da tabela foi configurada...

    System.ArgumentException: 

       at TriggerHistorico.ExecuteTriggerHistorico()

    .

    The statement has been terminated.

     

     

    quinta-feira, 12 de maio de 2011 12:26
  • Andre, este erro não me parece ser do SQL.

    De qualquer forma, qual o seu objetivo com este Insert? É só inserir na tabela CentrosCusto quando a empresa ainda não existir nesta tabela? Se for isso, esta tabela também deverá estar linkada no "Not Exists". Por favor, dê maiores esclarecimentos.


    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    domingo, 15 de maio de 2011 19:41
  • Roberson bom dia!!

    Isso mesmo não pode duplicar as empresas, tem que inserir só as empresas que ainda não tiverem.

    Poderia me ajudar pois esta dando erro.

    Obrigado. 

    terça-feira, 17 de maio de 2011 12:18
  • Então André, neste caso, se for usar o Not Exists, a tabela do Insert deve estar dentro do Not Exists.

    Ex.:

    INSERT INTO CentrosCusto ([EmpresaId],[Nome],[Ativo],[Descricao])
    SELECT E.Id,'00021598',1,'SAO PAULO'
    FROM
      Empresas E INNER JOIN Divisoes D ON E.DivisaoId = D.Id
                            INNER JOIN Corporacoes C ON D.CorporacaoId = C.Id
    WHERE
      (C.Id = 18) and
      (NOT EXISTS (SELECT
                     CC.EmpresaId
                   FROM
                     CentrosCusto CC
                   Where
                     (CC.EmpresaId = E.Id)))

    Roberson Ferreira


    Se esta sugestão for útil, por favor, classifique-a como útil.
    Se ela lhe ajudar a resolver o problema, por favor, marque-a como Resposta.

    • Marcado como Resposta AndreLPTI terça-feira, 17 de maio de 2011 19:00
    terça-feira, 17 de maio de 2011 15:40
  • Roberson,

    Muito obrigado mesmo, me ajudou demais.

    Só no where do EXITS que tive que fazer mais uma comparação, pois só estava comparando as empresas.

    SELECT E.Id,'00021598',1,'SAO PAULO'
    FROM
    Empresas E INNER JOIN Divisoes D ON E.DivisaoId = D.Id
    INNER JOIN Corporacoes C ON D.CorporacaoId = C.Id
    WHERE
    (C.Id IN (78,82,70,71,82,362,82,372,70,71,142,243,243,243,71,78,362,362)) and
    (NOT EXISTS (SELECT
    CC.EmpresaId
    FROM
    CentrosCusto CC
    Where
    (CC.EmpresaId = E.Id And CC.Nome = '00021598')))
    terça-feira, 17 de maio de 2011 19:00