none
Migrar dados para uma tabela nova. RRS feed

  • Pergunta

  • Boa tarde Galera,

    Preciso de uma ajuda:

    Hoje duas de minhas tabelas do Banco de Dados já está saturado, o que foi indicado para mim é desmembrar essas tabelas, pois queria que os dados fossem migrado para uma nova tabela que irei criar. Hoje simulei com uma tabela nova e outra tabela (esta aonde os dados antigos estão armazenados), ocorreu tudo no conforme!, como faço para a nova tabela receber os (dados da segunda tabela antiga) ?

    O que eu já fiz hoje foi:

    • Hoje fiz em um script diferente (INSERT INTO TABELA_NOVA) (SELECT * FROM TABELA_ANTIGA), coloquei separadamente e os dois apresentaram erros.
    • Eu fiz no mesmo SCRIPT (INSERT INTO TABELA_NOVA) (SELECT * FROM TABELA_ANTIGA1) e (INSERT INTO TABELA_NOVA) (SELECT * FROM TABELA_ANTIGA2), pois eu deduzi que os mesmo dados iam para a mesma tabela nova, mas também não ia ocorreu conforme o solicitado,
    • A primeira tabela foi tudo normalmente, pois não há chave estrangeira, mas a segunda há pelo menos 4 chaves estrangeira).
    terça-feira, 17 de novembro de 2015 16:08

Respostas

  • Milton,

    O teu problema é que você não pode fazer um UNION da forma que está fazendo... 

    O que você está fazendo você teria como resultado algo como

    Dado1Coluna1TabelaAntiga1    Dado1Coluna2TabelaAntiga1

    Dado2Coluna1TabelaAntiga1    Dado2Coluna2TabelaAntiga1

    Dado3Coluna1TabelaAntiga1    Dado3Coluna2TabelaAntiga1

    Dado1Coluna1TabelaAntiga2    Dado1Coluna2TabelaAntiga2

    Dado2Coluna1TabelaAntiga2    Dado2Coluna2TabelaAntiga2

    Dado3Coluna1TabelaAntiga2    Dado3Coluna2TabelaAntiga2

    Se é isso o que deseja, crie a tabela nova com apenas duas colunas.

    Agora, para que a tabela tenha as 4 colunas, você deve fazer um join entre as duas tabelas antigas.

    Algo como

    SELECT TB1.COLUNA1, TB1.COLUNA2, TB2.COLUNA1, TB2.COLUNA2
    FROM TabelaAntiga1 TB1
    JOIN TabelaAntiga2 TB2
    ON TB1.PK = TB2.PK_TB1
    

    Espero que te ajude.

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    • Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
    quarta-feira, 18 de novembro de 2015 19:04
  • Boa tarde Logan,

    Muito obrigado pela dica, mas o problema foi do banco poderia haver mais de um registro, mesmo assim já pode marcar como resposta.

    Milton Honji.

    • Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:04
    terça-feira, 24 de novembro de 2015 17:04

Todas as Respostas

  • Milton boa tarde

    exatamente vai ter que realizar esse script

    insert into Tabela_nova 
    values
    (select Campos from Tabela_Antiga)

    mas confere os campos se estão ok, e as chaves estrangeiras se suas respectivas tabelas estiverem preenchidas correto não vai dar problema.

    Abraço

    Espero ter ajudado.



    • Editado Danilo Telles terça-feira, 17 de novembro de 2015 16:28
    terça-feira, 17 de novembro de 2015 16:28
  • Boa tarde,

    Milton, não sei se entendi corretamente mas experimente dessa forma:

    INSERT INTO TABELA_NOVA
        SELECT * FROM TABELA_ANTIGA1
        UNION ALL
        SELECT * FROM TABELA_ANTIGA2;

    Espero que ajude.


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

    terça-feira, 17 de novembro de 2015 16:34
  • Boa tarde,

    Milton tenho um amigo que compartilhou um script que identifica, drop e recria as Fks.

    segue o link 


    Se a resposta foi útil por favor classifique. Tiago Neves - @tiagolneves - acesse o meu blog http://www.tiagoneves.net

    terça-feira, 17 de novembro de 2015 16:39
  • Milton,

    A princípio acredito que o uso do Insert...Select, quais seriam os erros que você esta recebendo?

    Você se referiu a existência de relacionamento na Tabela2, neste caso, o mais indicado é você migrar tudo o que não possui relacionamento, posteriormente migrar esta Tabela2 mas ter certeza que os dados não estarão infrigindo qualquer regra de integridade referencial.

    Por padrão em qualquer processo de importação ou migração os relacionamentos, índices ou qualquer outra tipo de constraints deve ser removido para evitar problemas de performance caso o volume de dados que você esteja trabalhando seja muito grande.


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    terça-feira, 17 de novembro de 2015 16:42
  • Boa tarde Gapimex,

    Tentei fazer o código deste jeito, verifiquei, analisei e mesmo assim não deu certo, talvez vou precisar colocar as chaves estrangeira antes de migrar para a nova tabela. 

    terça-feira, 17 de novembro de 2015 19:10
  • Você pode explicar o que não deu certo? Foi exibida alguma mensagem de erro? Se foi, qual?

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

    terça-feira, 17 de novembro de 2015 19:24
  • Gapimex,

    Apareceu esta mensagem, mas muito obrigado pela sugestão.

    Server: Msg 120, Level 15, State 1, Line 101
    The select list for the INSERT statement contains fewer items than the insert list. The number of SELECT values must match the number of INSERT columns.

    terça-feira, 17 de novembro de 2015 19:26
  • Pela mensagem de erro a tabela nova possui uma quantidade de colunas maior que as tabelas antigas.

    Nesse caso acredito que uma alternativa seria especificar a lista de colunas onde serão inseridos os valores, sendo que as demais colunas ficariam nulas. Ex:

    INSERT INTO TABELA_NOVA (Id, Nome, CPF)
        SELECT Id, Nome, CPF FROM TABELA_ANTIGA1
        UNION ALL
        SELECT Id, Nome, CPF FROM TABELA_ANTIGA2;

    Outra alternativa seria colocar valores fixos para as novas colunas no Select, sendo possível colocar inclusive null. Ex:

    INSERT INTO TABELA_NOVA (Id, Nome, CPF, ColunaNova1, ColunaNova2)
        SELECT Id, Nome, CPF, null, 'A' FROM TABELA_ANTIGA1
        UNION ALL
        SELECT Id, Nome, CPF, null, 'B' FROM TABELA_ANTIGA2;

    Espero que ajude.


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

    terça-feira, 17 de novembro de 2015 19:41
  • Bom dia, 

    Hoje refiz a tabela novamente com apenas com os campos que terão os registros migrado para esta tabela nova e também declarei as chaves estrangeiras na tabela, mas mesmo assim não estou conseguindo mesmo com o procedimento do SELECT e o UNION, fiz do mesmo jeito e o erro aparece o mesmo.

    quarta-feira, 18 de novembro de 2015 12:15
  • Bom dia,

    Se for migração dos dados para um tabela nova e sem informações cadastradas, primeiro crie a tabela com o select into e depois gere os scripts de criação das chaves, trigger, fk e pk.

    Me add no skype que te ajudo: contato.fabiocerqueira


    Atenciosamente, Fábio Cerqueira Analista de Suporte Skype: contato.fabiocerqueira Cel: 71 9986.9295 Site: www.fabiocerqueira.com

    quarta-feira, 18 de novembro de 2015 12:27
  • Bom dia,

    Milton, você pode postar o comando que você tentou executar?


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

    quarta-feira, 18 de novembro de 2015 12:33
  • Bom dia Fabio,

    mas pelo que verifiquei nas duas tabelas que há dois campos com o mesmo nome e os dois tem chave estrangeira.

    quarta-feira, 18 de novembro de 2015 12:43
  • Outra opção seria criar uma tabela particionada com a mesma estrutura e migrar os dados, assim não precisaria trabalhar com desmembramento.
    quarta-feira, 18 de novembro de 2015 16:07
  • Boa tarde André,

    Mas o SQL que estou utilizando é o 2000, nesta versão por enquanto não dá para trabalhar com a tabela particionada.

    quarta-feira, 18 de novembro de 2015 17:06
  • Boa tarde,

    Infelizmente, por politica da empresa não posso disponibilizar o código.

    mas fiz assim

    INSERT INTO TABELA NOVA

    (

    COLUNA1_mesmo_nome_tabela_ant_1,

    COLUNA2_mesmo_nome_tabela_ant_1,

    COLUNA1_mesmo_nome_tabela_ant_2,

    COLUNA2_mesmo_nome_tabela_ant_2,

    )

    SELECT

    COLUNA1

    COLUNA2

    )

    FROM TABELA_ANTIGA_1

    UNION ALL

    SELECT

    (

    COLUNA1,

    COLUNA2

    )

    FROM TABELA_ANTIGA_2

    Tinha Esquecido de falar utilizo o SQL 2000.

    Pensei em uma hipótese sobre colocar a chave estrangeira, após criar as tabelas, antes de colocar todos os registros.Será que isso é uma boa ideia?

    • Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
    • Não Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
    quarta-feira, 18 de novembro de 2015 18:51
  • Milton,

    O teu problema é que você não pode fazer um UNION da forma que está fazendo... 

    O que você está fazendo você teria como resultado algo como

    Dado1Coluna1TabelaAntiga1    Dado1Coluna2TabelaAntiga1

    Dado2Coluna1TabelaAntiga1    Dado2Coluna2TabelaAntiga1

    Dado3Coluna1TabelaAntiga1    Dado3Coluna2TabelaAntiga1

    Dado1Coluna1TabelaAntiga2    Dado1Coluna2TabelaAntiga2

    Dado2Coluna1TabelaAntiga2    Dado2Coluna2TabelaAntiga2

    Dado3Coluna1TabelaAntiga2    Dado3Coluna2TabelaAntiga2

    Se é isso o que deseja, crie a tabela nova com apenas duas colunas.

    Agora, para que a tabela tenha as 4 colunas, você deve fazer um join entre as duas tabelas antigas.

    Algo como

    SELECT TB1.COLUNA1, TB1.COLUNA2, TB2.COLUNA1, TB2.COLUNA2
    FROM TabelaAntiga1 TB1
    JOIN TabelaAntiga2 TB2
    ON TB1.PK = TB2.PK_TB1
    

    Espero que te ajude.

    []'s!


    /* Logan Destefani Merazzi - DBA | @LoganMerazzi | http://www.merazzi.eti.br
    Se a resposta for útil, vote nela. Se resolveu, marque-a como resposta. */

    • Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:05
    quarta-feira, 18 de novembro de 2015 19:04
  • Você pode reconstruir o Id das tabelas antigas, e inserir uma nova numeração, evitando assim o erro de chaves estrangeiras, ou pode usar o Import Export do próprio SQL SERVER.
    • Editado Poliana Dias quarta-feira, 18 de novembro de 2015 19:18
    • Sugerido como Resposta Marcos SJ sexta-feira, 20 de novembro de 2015 11:39
    quarta-feira, 18 de novembro de 2015 19:15
  • Boa tarde Logan,

    Muito obrigado pela dica, mas o problema foi do banco poderia haver mais de um registro, mesmo assim já pode marcar como resposta.

    Milton Honji.

    • Marcado como Resposta Milton Honji terça-feira, 24 de novembro de 2015 17:04
    terça-feira, 24 de novembro de 2015 17:04
  • Você pode reconstruir o Id das tabelas antigas, e inserir uma nova numeração, evitando assim o erro de chaves estrangeiras, ou pode usar o Import Export do próprio SQL SERVER.

    Poliana,

    Com base, neste resposta do Logan, me veio a cabeça da possibilidade de você criar uma nova tabela fazendo uso do Identity diretamente no comando de Select Into.

    Veja este exemplo:

    -- Utilizando - Função - Identity no Select Into --
    select identity(int, 1,1) As Seq, name into #teste from sys.sysdatabases


    Pedro Antonio Galvao Junior [MVP | MCC | Microsoft Evangelist | Microsoft Partner | Engenheiro de Softwares | Especialista em Banco de Dados | Professor Universitario | SoroCodigos | @JuniorGalvaoMVP | http://pedrogalvaojunior.wordpress.com]

    quinta-feira, 26 de novembro de 2015 09:45