none
Import and Export Wizard RRS feed

  • Pergunta

  • Boa noite, 

    Estou com o seguinte cenario :

    Utilizo o Protheus como ERP na minha empresa , tenho uma database que possui 5 empresas dentro diferenciando apenas o final da tabela.

    Ex : Empresa 1 = SB1010 , Empresa 2 = SB1020, Empresa 3 = SB1030  e assim sucessivamente.

    Estou criando uma nova database para receber apenas os dados de uma unica empresa, porem no export Wizard ele me dá a opção de selecionar os objetos ou escrever a query, se for utilizar o selecionar objeto terei que marcar 1260 tabelas.

    Tentei utilizar a query porem não estou conseguindo fazer que o Wizard entenda que o que quero são os objetos e não um select com as tabelas que terminam com 030.

    Alguem saberia me dizer como faço para na opção query ele entenda que é para carregar os objetos completos da database ? 


    Donny Rivera

    quarta-feira, 20 de junho de 2012 04:00

Respostas

  • Pessoal depois de horas segue query 
    use Lisavix 
    go 
     
    if ( object_id('Lisavix.._lv_tabelas') is not null ) 
        drop table Lisavix.._lv_tabelas 
    
    create table Lisavix.._lv_tabelas
        (
          id int identity(1, 1) ,
          name varchar(100)
        )
     
    -- listando as tabelas da database de origem
    use baseteste
    go
     
    insert  into Lisavix.._lv_tabelas
            select  'select ' + '*' + ' ' + 'into' + ' ' + name + ' ' + 'from'
                    + ' ' + 'baseteste..' + name as name
            from    sys.objects
            where   --like '%030%'                   -- tabela com o final do nome 030
                    SUBSTRING(name,1,1) = '_'
                    and type_desc = 'user_table'   -- objeto é uma tabela
     
     
    -- verificar se incluiu todas as tabelas desejadas
    	
    	-- select * from lisavix.._lv_tabelas
      
    -- copiando os dados das tabelas
    use Lisavix
    
    declare @count int ,
    		@comandosql varchar(200)
    
    select  @count = ( select   count(*)
                       from     _lv_tabelas
                     )
    
    while ( @count > 0 ) 
        begin
            select  @comandosql = name
            from    _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
          
          -- executa o comando que foi passado como string
            exec(@comandosql)
          
            delete  _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
            select  @count = @count - 1
    
        end
    
    --dropar tabelas
    
    if ( object_id('lisavix.._lv_tabelas') is not null ) drop table lisavix.._lv_tabelas 
    
    create table lisavix.._lv_tabelas
        (
          id int identity(1, 1) ,
          name varchar(100)
        )
    
    insert  into lisavix.._lv_tabelas
            select  'drop table ' + name as name
            from    sys.objects
            where   substring(name, 1, 1) = '_' -- tabelas temporarias criadas pelo usuario
                    and type_desc = 'user_table'
                    and name <> '_lv_tabelas'     
     
    --select * from dbo.[_lv_tabelas]
    
    declare @count int ,
    		@comandosql2 varchar(200)
    
    select  @count = ( select   count(*)
                       from     _lv_tabelas
                     )
    
    while ( @count > 0 ) 
        begin
            select  @comandosql2 = name
            from    _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
          
          -- executa o comando que foi passado como string
            exec(@comandosql2)
          
            delete  _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
            select  @count = @count - 1
    
        end 
    
    Depois dessa vou guardar essa query com a minha vida ^^

    Donny Rivera

    • Marcado como Resposta Riv3ra quarta-feira, 20 de junho de 2012 20:29
    quarta-feira, 20 de junho de 2012 18:34

Todas as Respostas

  • Olá Riv3ra,

         Já passei por uma situação identica a sua e por coincidencia o mesmo sistema. Como na epoca existia uma urgência e tambem a quantidade de tabelas era grande fui simples e ojetivo, pois não valia a pena sair selecionando uma pancada de tabelas. rsrsrsrs

    1º - Restaurei o backup da base atual na nova base de dados,

    2º - Preparei um Select onde seu saida era o um DROP TABLE com as tabelas que pretendia descarta da nova base de dados,

    3º - Peguei o DROP TABLE e executei.

         Foi uma solução bem estranha, mas funcionou perfeitamente.


    quarta-feira, 20 de junho de 2012 11:04
  • Bom dia Wellington, 

    Pensei nessa solução também , porem tenho um problema a minha database de produção possui 50gb (todas as empresas) e o espaço que possuo é de apenas 20gb não teria como eu copiar toda a database e outro problema que ainda não achei a solução foi fazer um DROP TABLE em N tabelas de uma só vez.


    Donny Rivera

    quarta-feira, 20 de junho de 2012 12:24
  • Olá Riv3ra,

         Os selects abaixo geram um saida com comando de DROP TABLE para as tabelas que terminan com 010 e 020.

         select 'DROP TABLE '+ convert(varchar(10), name) from sys.objects where name like '%010'

         select 'DROP TABLE '+ convert(varchar(10), name) from sys.objects where name like '%020'

    Procurando uns scripts que utilizei na epoca encontrei esse abaixo, mas esse script utilezei quando fui migrar outra empresa com um numero menor de tabelas. Mesmo assim segue a sugestão.

    SELECT 'select '+'*'+' '+ 'into' +' '+ convert(varchar(10), name)+' '+ 'from' +' '+'BaseOrigem..'+ convert(varchar(10), name)
    FROM sys.objects
    WHERE name like '%030'

         A sugestão do Eduardo G. Pereira é execelente o SSIS é uma ferramenta muito poderosa.

    • Editado Wellington_SQL quarta-feira, 20 de junho de 2012 13:05 Adição de msg
    quarta-feira, 20 de junho de 2012 12:53
  • Donny bom dia.

    Uma outra solução seria montar um pacote SSIS utilizando o foreach Looping task. Desta forma vc selecionaria apenas as tabelas necessárias dentro do sysobjects e passaria o parâmetro da tabela desejada no container Foreach Looping. É muito simples fazer isto.

    A solução do Welligton é boa também e na minha opinião 20GB é muito pouco para se trabalhar com volumes tão grandes de tabelas. Tente liberar mais espaço com o seu pessoal de infra. Para dropar as tabelas dinamicamente, monte um looping cursor selecionando as tabelas que deseja descartar faça um drop table dinamico.

    Abs.


    Eduardo Gomes - http://www.h1solucoes.com.br - Twitter: @edugp_sp


    quarta-feira, 20 de junho de 2012 12:56
  • Wellington , 

    Desculpa mas estou começando em banco de dados a pouco tempo , como faço para que esse seu select realmente gere o comando de drop table ? 

    Estou testando aqui e só consigo fazer ele virar uma string, tenho q utilizar qual função ? 


    Donny Rivera

    quarta-feira, 20 de junho de 2012 13:26
  • Eduardo bom dia, 

    Não conheço nada no SSIS, vou dar uma pesquisada a respeito para ver se consigo gerar alguma coisa.

    Obrigado 


    Donny Rivera

    quarta-feira, 20 de junho de 2012 13:27
  • Olá Riv3ra,

         Os selects que te passei geram uma saida(resulta) que é DROP TABLE tabela ou um SELECT INTO. Ai você pega esse comando e execute na base de dados que desejar.

         Já que você não possui muita experiência com banco de dados e principalmente com esse tipo de operação(Migração) aconselho procurar um especialista para evitar possivel transtornos ou perca de dados..

    quarta-feira, 20 de junho de 2012 13:30
  • Estou fazendo em ambiente teste , copiei 3 tabelas para a minha database nova e estou tentando dropar com o comando que vc me passou eu rodo e no result set ele me mostra o DROP TABLE SB1030 porem a tabela não é dropada.  

    Como eu trato esse resulta ?? tentei colocar dentro de uma string e ele não aceitou.

    Obrigado !


    Donny Rivera

    quarta-feira, 20 de junho de 2012 13:35
  • Riv3ra,

         Pronto, você copia o DROP TABLE SB1030 que sai no resulte set abre uma nova aba cola o DROP TABLE SB1030 e executa que a tabela vai ser dropada.

    O comando select 'DROP TABLE '+ convert(varchar(10), name) from sys.objects where name like '%010' não dropa a tabela apenas gera o comando para dropar a tabela.

        


    quarta-feira, 20 de junho de 2012 13:44
  • Wellington,

    Entendi , muito legal esse macete pra gerar script.



    Donny Rivera

    quarta-feira, 20 de junho de 2012 14:11
  • Pessoal depois de horas segue query 
    use Lisavix 
    go 
     
    if ( object_id('Lisavix.._lv_tabelas') is not null ) 
        drop table Lisavix.._lv_tabelas 
    
    create table Lisavix.._lv_tabelas
        (
          id int identity(1, 1) ,
          name varchar(100)
        )
     
    -- listando as tabelas da database de origem
    use baseteste
    go
     
    insert  into Lisavix.._lv_tabelas
            select  'select ' + '*' + ' ' + 'into' + ' ' + name + ' ' + 'from'
                    + ' ' + 'baseteste..' + name as name
            from    sys.objects
            where   --like '%030%'                   -- tabela com o final do nome 030
                    SUBSTRING(name,1,1) = '_'
                    and type_desc = 'user_table'   -- objeto é uma tabela
     
     
    -- verificar se incluiu todas as tabelas desejadas
    	
    	-- select * from lisavix.._lv_tabelas
      
    -- copiando os dados das tabelas
    use Lisavix
    
    declare @count int ,
    		@comandosql varchar(200)
    
    select  @count = ( select   count(*)
                       from     _lv_tabelas
                     )
    
    while ( @count > 0 ) 
        begin
            select  @comandosql = name
            from    _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
          
          -- executa o comando que foi passado como string
            exec(@comandosql)
          
            delete  _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
            select  @count = @count - 1
    
        end
    
    --dropar tabelas
    
    if ( object_id('lisavix.._lv_tabelas') is not null ) drop table lisavix.._lv_tabelas 
    
    create table lisavix.._lv_tabelas
        (
          id int identity(1, 1) ,
          name varchar(100)
        )
    
    insert  into lisavix.._lv_tabelas
            select  'drop table ' + name as name
            from    sys.objects
            where   substring(name, 1, 1) = '_' -- tabelas temporarias criadas pelo usuario
                    and type_desc = 'user_table'
                    and name <> '_lv_tabelas'     
     
    --select * from dbo.[_lv_tabelas]
    
    declare @count int ,
    		@comandosql2 varchar(200)
    
    select  @count = ( select   count(*)
                       from     _lv_tabelas
                     )
    
    while ( @count > 0 ) 
        begin
            select  @comandosql2 = name
            from    _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
          
          -- executa o comando que foi passado como string
            exec(@comandosql2)
          
            delete  _lv_tabelas
            where   id = ( select   min(id)
                           from     _lv_tabelas
                         )
            select  @count = @count - 1
    
        end 
    
    Depois dessa vou guardar essa query com a minha vida ^^

    Donny Rivera

    • Marcado como Resposta Riv3ra quarta-feira, 20 de junho de 2012 20:29
    quarta-feira, 20 de junho de 2012 18:34