| Exibir mensagem anterior :: Exibir próxima mensagem | 
	
	
		| Autor | Mensagem | 
	
		| natanbh1 Colaborador
 
  
 
 Registrado: Terça-Feira, 15 de Março de 2011
 Mensagens: 3093
 Localização: Belo Horizonte - MG
 
 | 
			
				|  Enviada: Qui Jul 23, 2020 6:24 pm    Assunto: Copiar tabela de um Servidor SQL para outro [Resolvido] |   |  
				| 
 |  
				| Preciso importar uma tabela de um Servidor SQL Server para outro Servidor SQL Server. 
 Consegui fazer funcionar criando 2 conexões ADO diferentes e percorrendo a query de origem e inserindo na query de destino:
 
 
  	  | Código: |  	  | procedure Tfrmtransf.CopiaTabela(DataSetOrigem, DataSetDestino: TDataSet); var
 Field: TField;
 begin
 DataSetOrigem.Open;
 DataSetOrigem.First;
 
 DataSetDestino.Open;
 
 ProgressBar1.Max := DataSetOrigem.RecordCount;
 ProgressBar1.Position := 0;
 
 while not DataSetOrigem.Eof do
 begin
 Application.ProcessMessages;
 ProgressBar1.Position := ProgressBar1.Position + 1;
 
 DataSetDestino.Append;
 
 for Field in DataSetOrigem.Fields do
 DataSetDestino.Fields[Field.Index].Value := Field.Value;
 
 DataSetDestino.Post;
 
 DataSetOrigem.Next;
 end;
 
 ProgressBar1.Position := 0;
 end;
 
 | 
 
 Mas desta maneira fica muito lenta a importação.
 
 Existe um script SQL para copiar dados entre tabelas de servidores diferentes?
 _________________
 ''A persistência é o caminho para o êxito.''
 Charlie Chaplin
 
 Editado pela última vez por natanbh1 em Sex Jul 24, 2020 11:18 am, num total de 1 vez
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| joemil Moderador
 
  
 
 Registrado: Quinta-Feira, 25 de Março de 2004
 Mensagens: 9100
 Localização: Sinop-MT
 
 | 
			
				|  Enviada: Sex Jul 24, 2020 9:24 am    Assunto: |   |  
				| 
 |  
				| ja tentou usar querys com CachedUpdates = true? assim vc pode enviar 100, 200, 300 registros de uma vez para o servidor de destino: 
 
  	  | Código: |  	  | procedure Tfrmtransf.CopiaTabela(DataSetOrigem, DataSetDestino: TDataSet); var
 Field: TField;
 begin
 DataSetOrigem.Open;
 DataSetOrigem.First;
 
 QueryDestino.CachedUpdates := True;
 QueryDestino.sql.Text := 'SELECT * FROM tabela WHERE 1 = 0';
 QueryDestino.Open;
 
 ProgressBar1.Max := DataSetOrigem.RecordCount;
 ProgressBar1.Position := 0;
 
 while not DataSetOrigem.Eof do
 begin
 Application.ProcessMessages;
 ProgressBar1.Position := ProgressBar1.Position + 1;
 
 QueryDestino.Append;
 
 for Field in DataSetOrigem.Fields do
 DataSetDestino.Fields[Field.Index].Value := Field.Value;
 
 QueryDestino.Post;
 
 DataSetOrigem.Next;
 
 if (QueryDestino.RecordCount >= 200) or (DataSetOrigem.Eof) then
 begin
 QueryDestino.ApplyUpdates;
 QueryDestino.Close;
 QueryDestino.Open;
 end;
 end;
 
 ProgressBar1.Position := 0;
 end;
 | 
 _________________
 <b>SEMPRE COLOQUE [RESOLVIDO] NO SEU POST</b>
 Enviar imagens: http://tinypic.com/
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| natanbh1 Colaborador
 
  
 
 Registrado: Terça-Feira, 15 de Março de 2011
 Mensagens: 3093
 Localização: Belo Horizonte - MG
 
 | 
			
				|  Enviada: Sex Jul 24, 2020 10:40 am    Assunto: |   |  
				| 
 |  
				| Obrigado pela sugestão Joelmil. 
 Estou usando componentes ADO e notei que a ADOQuery não tem as propriedades CachedUpdates e ApplyUpdates.
 
 Tem a propriedade ChacheSize.
 
 Há possibilidade de trabalhar em Cache com ADO?
 _________________
 ''A persistência é o caminho para o êxito.''
 Charlie Chaplin
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| natanbh1 Colaborador
 
  
 
 Registrado: Terça-Feira, 15 de Março de 2011
 Mensagens: 3093
 Localização: Belo Horizonte - MG
 
 | 
			
				|  Enviada: Sex Jul 24, 2020 11:09 am    Assunto: |   |  
				| 
 |  
				| Dei uma pesquisada e consegui adaptar o código para o ADO. 
 Altere a propriedade CacheSize para a quantidade de registros que você quer armazenar em memória e o comando para atualizar no banco é o UpdateBatch.
 
 É necessário alterar também a propriedade LockType para ltBatchOptimistic.
 
 O código ficou assim:
 
 
  	  | Código: |  	  | procedure CopiaTabela(DataSetOrigem, DataSetDestino: TADOQuery; tabela: string); var
 Field: TField;
 begin
 DataSetOrigem.Open;
 DataSetOrigem.First;
 
 DataSetDestino.CacheSize := 1000;
 DataSetDestino.LockType := ltBatchOptimistic;
 DataSetDestino.SQL.Text := Concat('SELECT * FROM ', tabela, ' WHERE 1 = 0');
 DataSetDestino.Open;
 
 ProgressBar1.Max := DataSetOrigem.RecordCount;
 ProgressBar1.Position := 0;
 
 while not DataSetOrigem.Eof do
 begin
 Application.ProcessMessages;
 ProgressBar1.Position := ProgressBar1.Position + 1;
 
 DataSetDestino.Append;
 
 for Field in DataSetOrigem.Fields do
 DataSetDestino.Fields[Field.Index].Value := Field.Value;
 
 DataSetOrigem.Next;
 
 if (DataSetDestino.RecordCount >= 1000) or (DataSetOrigem.Eof) then
 begin
 DataSetDestino.Post;
 DataSetDestino.UpdateBatch();
 DataSetDestino.Close;
 DataSetDestino.Open;
 end;
 end;
 
 ProgressBar1.Position := 0;
 end;
 | 
 
 Uma importação de 2.400 registros que gastava 7 minutos e 30 segundos passou a ser feita em 1 e 30 segundos. Ótimo!
 
 Se houver uma outra maneira mais eficiente ainda, eu aceito sugestões rsrs..
 
 Muito obrigado Joemil.
 _________________
 ''A persistência é o caminho para o êxito.''
 Charlie Chaplin
 
 Editado pela última vez por natanbh1 em Seg Jul 27, 2020 10:44 am, num total de 1 vez
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 | 
			
				|  Enviada: Sex Jul 24, 2020 11:24 am    Assunto: |   |  
				| 
 |  
				| Bom dia, 
 natanbh1, não sei se você chegou a testar mas uma alternativa no SQL Server seria configurar um linked server.
 Com essa ligação seria possível executar por exemplo um Insert / Select onde os dados não trafegariam pela aplicação, mas você também não conseguiria exibir para o usuário a evolução da execução do comando.
 Não sei ao certo como vai ser a diferença no desempenho.
 
 Espero que ajude
 
 Editado pela última vez por imex em Qui Set 16, 2021 5:27 pm, num total de 1 vez
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| natanbh1 Colaborador
 
  
 
 Registrado: Terça-Feira, 15 de Março de 2011
 Mensagens: 3093
 Localização: Belo Horizonte - MG
 
 | 
			
				|  Enviada: Sex Jul 24, 2020 11:45 am    Assunto: |   |  
				| 
 |  
				| Bom dia Imex, 
 Nas minhas pesquisas anteriores, encontrei o link abaixo que indica essa opção do linked-server mas não explica como configurar:
 
 Como transferir os dados de uma tabela para outra em servidores diferentes
 
 Você sabe como configurar um linked-server no SQL Server?
 _________________
 ''A persistência é o caminho para o êxito.''
 Charlie Chaplin
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| imex Moderador
 
  
 
 Registrado: Sexta-Feira, 7 de Janeiro de 2011
 Mensagens: 11666
 
 
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		| natanbh1 Colaborador
 
  
 
 Registrado: Terça-Feira, 15 de Março de 2011
 Mensagens: 3093
 Localização: Belo Horizonte - MG
 
 | 
			
				|  Enviada: Seg Jul 27, 2020 10:41 am    Assunto: |   |  
				| 
 |  
				| Vou tentar implementar e analisar a performance. 
 Muito obrigado Imex.
 _________________
 ''A persistência é o caminho para o êxito.''
 Charlie Chaplin
 |  | 
	
		| Voltar ao Topo |  | 
	
		|  | 
	
		|  |