Já copiou o resultado de determinada consulta no SSMS (SQL Server Management Studio), colou em uma planilha do Excel e se surpreendeu com a bagunça?
O que era pra ser uma solução rápida e prática acabou virando uma zona?
Eis o cenário:
O intuito deste post é explicar o que causa o problema e como resolver.
Problema
O problema acontece quando o resultado copiado possui caracteres como quebra de linha, tab, etc. Estes caracteres são interpretados no Excel, se copiados diretamente, como comandos e acabam por desconfigurar no momento de colar.
Vamos simular o problema:
1) Criando uma massa pra testes. Existe um propósito em manter os textos no INSERT com espaço. Deixe-os desta forma caso use o código abaixo.
USE TEMPDB GO CREATE TABLE dbo.Posts ( ID INT IDENTITY (1,1) NOT NULL, DATA DATE, RESUMO VARCHAR(500) ); INSERT INTO DBO.POSTS (DATA, RESUMO) VALUES ('2014-01-05','O intuito do post é relacionar: O reino animal, o perigo da extinção e o mercado de TI. '); INSERT INTO DBO.POSTS (DATA, RESUMO) VALUES ('2014-01-12','O intuito do post é relacionar: SQL Server e seus diferentes tipos de buffer '); INSERT INTO DBO.POSTS (DATA, RESUMO) VALUES ('2014-01-19', 'O intuito do post é simplesmente: Compartilhar uma novidade de uma feature que existe aqui só na minha máquina ');
2) Consultando a tabela recém-criada, gerando um resultset com caracteres de controle:
3) Copie o resultset (de preferência com o cabeçalho, botão direito no resultado da consulta, opção “Copy with Headers“, e cole no Excel:
Solução
Alguns usuários do SQL Server já abriram chamado na Microsoft para relatar o problema, que aparentemente não possui soluções definitivas, mas existe um workaround (aqui no Brasil usa-se o termo solução de contorno, alguns dizem gambiarra, etc).
Sabendo que o problema acontece quando o resultset possui caracteres como quebra de linha, tab, dentre outros (conhecidos como caracteres de controle), que são interpretados como comandos no Excel, podemos converter esses caracteres em espaço, podendo assim sacrificar a formatação original do campo em prol da realização da tarefa.
Na tabela ASCII, vamos identificar quais caracteres devem ser primariamente localizados:
Abaixo, segue dentro dos parênteses os códigos ASCII do que pretendemos remover:
- CHAR(9) = Tab
- CHAR(10) = Line Feed (LF)
- CHAR(13) = Carriage Return (CR)
Tab é tab é dispensa explicações. Já Carriage Return e Line Feed são dois caracteres de controle que com frequência caminham de mãos dadas quando uma quebra de linha acontece. Em outras palavras, um ENTER, por exemplo, faz a quebra utilizando estes dois caracteres.
Pra facilitar o entendimento:
Podemos usar os códigos destes caracteres de controle dentro da função REPLACE e substituí-los por espaço, de modo que nossa cópia não fique desconfigurada. Note que você pode fazer o mesmo sem passar espaço, pode passar entre aspas vazias também.
SELECT id, data, REPLACE(REPLACE(REPLACE(CAST(Resumo AS CHAR(150)), CHAR(10), ''), CHAR(13), ''),CHAR(9),'')as [Resumo] FROM dbo.Posts
Agora, vamos colar o resultado sem quebrar o resultset:
Copiando e colando no excel:
O workaround, assim como mais informações a respeito do problema, foram postados nos dois links abaixo no connect:
Conclusão
A solução apresentada permite a cópia sem maiores problemas sacrificando a formatação original de textos que possuem caracteres de controle. Caso seja realmente necessário manter a formatação, é possível realizar a importação de dados para o Excel de forma direta utilizando outros métodos, que não estão descritos neste post.
[]’s
Referências
- CHAR Function – http://msdn.microsoft.com/pt-br/library/ms187323.aspx
- REPLACE Function – http://msdn.microsoft.com/pt-br/library/ms186862.aspx
- Carriage Return (CR)- http://pt.wikipedia.org/wiki/Carriage_return
- Line Feed (LF) – http://en.wikipedia.org/wiki/Newline
- Tabela ASCII – http://www.theasciicode.com.ar/ascii-control-characters/horizontal-tab-ascii-code-9.html
21 responses to “Copiar resultado do SSMS no Excel sem quebra”
obrigada, este erro estava perdendo muito tempo para corrigir no excel
Que bom Francis! A ideia era essa. Também já sofri muito com isso. []’s
Renato, valeu por compartilhar, salvou mesmo!
Massa!
Boa Manolo, isso salvou meu dia
Bom saber. Valeu pelo comentário
CARA, muito bacana esse seu post.
Fiquei umas horas até encontrar e finalmente conseguir resolver meu problema.
Bug miserável!
Muito obrigada. 🙂
Que bom que tenha gostado e que principalmente, ajudou a resolver um problema.
Eu que agradeço o comentário e a sua leitura.
[]’s
Show de bola…me ajudou muito, bem simples e bem explicado, mas nem tinha pensado nessa solução haha…vlw!
Bom que te ajudou, vlw!
Renato, boa tarde!
Suas dicas me ajudaram a solucionar o meu problema!
Muito obrigada por disponibilizar este post 🙂
Feliz que te ajudou! Disponha
Resolveu meu problema também, passava horas e horas corrigindo planilhas.
Deus o abençoe, por compartilhar o bem, kkkk
Opa, feliz em ter contribuído. Abs
Valeu pela ajuda, salvou um colega de trabalho aqui do meu lado que tava se quebrando a manhã toda pra remover as quebras de linha.
Que bom que foi útil pra mais alguém.
Vlw por comentar Toni.
[]’s
Boa tarde Renato!
Valeu pela dica, muito rica nos detalhes.
que bom que foi útil, vlws
Valeu!
Muito obrigado! Salvou um colega de profissão!!!
Parabéns.
Legal saber que o post ajudou, valeu pelo retorno