72 votes

Nouveau problème de ligne lors de la copie de données de SQL Server 2012 vers Excel

J'ai récemment effectué une mise à niveau vers SQL2012 et j'utilise Management Studio. Une de mes colonnes dans la base de données a un CHAR(13) + CHAR(10) qui y est stocké.

Lorsque j'utilisais SQL Server 2008, cette opération se copiait et se collait parfaitement dans Excel. Aujourd'hui, cependant, copier et coller les mêmes données crée une nouvelle ligne/un retour chariot dans les données que j'ai dans Excel.

Y a-t-il un paramètre que j'ai manqué dans SQL2012 pour résoudre ce problème ? Je ne veux pas simplement REPLACE(CHAR(13) + CHAR(10)) sur chaque sélection de base de données, car je devrais passer de l'utilisation de SELECT * pour définir chaque colonne individuelle.

0 votes

Comment copier et coller, en sélectionnant simplement les résultats de la requête, ctrl+c, ctrl+V ?

0 votes

J'ai reproduit l'erreur avec Management Studio 2008 (pas de nouvelles lignes) et Management Studio 2012 (nouvelles lignes), en utilisant la requête select top 10 char(10) + char(13) as [struff] from dbo.tbEntries

2 votes

Vous dites donc que vous ne voulez pas que le retour chariot apparaisse dans Excel, bien qu'il soit dans les données ? Si c'est le cas, il semble qu'ils aient simplement corrigé un bug de 2008 à 2012... Si c'est la façon dont vos données sont représentées, vous devez les manipuler pour obtenir le format que vous souhaitez.

56voto

Robert Jeppesen Points 4541

Je pense que ce n'est pas un bogue, mais une fonctionnalité de Sql 2012 ;-) Dans d'autres contextes, vous seriez heureux de conserver vos cr-lf, comme lorsque vous copiez un gros morceau de texte. C'est juste que cela ne fonctionne pas bien dans votre situation.

Vous pouvez toujours les dépouiller dans votre sélection. Ainsi, votre requête fonctionnera comme vous le souhaitez dans les deux versions :

select REPLACE(col, CHAR(13) + CHAR(10), ', ') from table

0 votes

Ce problème est aggravé par le fait que l'interprétation par Excel des données contenues dans le presse-papiers dépend du dernier caractère séparateur utilisé pour une opération "texte vers colonnes". La valeur par défaut est " \t " (tabulation), mais le problème semble maintenant être que SSMS 2012 altère en fait les données dans les cellules, en convertissant " \r " à " \r\n "sur le presse-papiers, ce qui est très très mauvais. Je le sais parce que mon client basé sur Flash enregistre les sauts de ligne comme " \r " (retours chariot), et lorsque j'ai collé ces données de SSMS 2008 dans Excel, cela ne déclenchait pas le démarrage d'une nouvelle ligne au milieu d'une cellule comme c'est le cas maintenant.

7 votes

Je devais courir select REPLACE(REPLACE(col, CHAR(13), '') CHAR(10), ' ') from table Pour s'assurer qu'aucun \n ou \r j'ai raté ma feuille Excel

4 votes

@Robert Fricke select REPLACE(REPLACE(col, CHAR(13), ''), CHAR(10), ' ') -- Tu as oublié une virgule là.

29voto

THelper Points 5527

J'ai trouvé une solution à ce problème : au lieu de copier-coller à la main, utilisez Excel pour vous connecter à votre base de données et importer la table complète. Supprimez ensuite les données qui ne vous intéressent pas.

Voici les étapes (pour Excel 2010)

  1. Aller au menu Data > Get external data: From other sources > From SQL Server
  2. Saisissez le nom du serveur sql (et les informations d'identification si vous n'avez pas d'authentification Windows sur votre serveur) et connectez-vous.
  3. Sélectionnez la base de données et la table qui contiennent les données avec les nouvelles lignes et cliquez sur "Terminer".
  4. Sélectionnez la feuille de calcul de destination et cliquez sur "Ok".

Excel va maintenant importer le tableau complet avec les nouvelles lignes intactes.

1 votes

En d'autres termes, SQL Server Management Studio 2012 est cassé, ne l'utilisez pas, et utilisez simplement Excel pour importer les données en laissant SSMS hors de la boucle. Ce n'est pas une solution, c'est simplement une reformulation du problème. Il est évident qu'il existe de nombreuses façons d'extraire des données de SQL Server et de les transférer dans Excel. Le problème, c'est que SSMS 2012 fait des erreurs qui empêchent de simplement copier/coller des données dans Excel comme on pouvait le faire avec SSMS 2008.

8 votes

@Triynko Oui, c'est pourquoi je l'ai appelé "une solution de rechange".

1 votes

Il ne s'agit pas d'une solution de rechange, mais d'une reformulation du problème. Le problème n'est pas seulement que SSMS ne fonctionne pas... c'est que SSMS ne fonctionne pas, et j'ai besoin d'utiliser SSMS . Une solution qui implique l'abandon total de SSMS n'est pas une solution du tout, et certainement pas une solution de contournement. Une solution de contournement impliquerait de faire quelque chose de différent dans SSMS, comme remplacer les caractères cr-lf par d'autres caractères ou modifier certaines options pour que cela fonctionne. L'importation de données d'Excel à partir de SQL Server ne fonctionne pas non plus, mais je ne m'attarderai pas sur ce point.

3voto

Alex Points 29

Cela se produit parfois avec Excel lorsque vous avez récemment utilisé "Texte en colonnes".

Essayez de sortir d'Excel, de le rouvrir et de le coller à nouveau. Cela fonctionne généralement pour moi, mais j'ai entendu dire que vous deviez parfois redémarrer votre ordinateur.

1voto

Jim Simoens Points 11

La solution de contournement suivante conserve le caractère CRLF et permet de coller des données contenant des caractères CRLF dans Excel sans diviser les données des colonnes en plusieurs lignes. Il faudra remplacer "select *" par des colonnes nommées et tous les guillemets dans les données seront remplacés par la valeur du délimiteur.

declare @delimiter char(1)
set @delimiter = '|'

declare @double_quote char(1)
set @double_quote = '"'

declare @text varchar(255)
set @text = 'This
"is"
a
test'

-- This query demonstrates the problem.  Execute the query and then copy/paste into Excel.
SELECT @text

-- This query demonstrates the solution.
SELECT @double_quote + REPLACE(@text, @double_quote, @delimiter) + @double_quote

1 votes

C'est bien, mais ça ne marche pas si vos données contiennent déjà des '|', ce qui est le cas des miennes. Il s'agit d'un logiciel éducatif en ligne et le champ Réponse de la base de données utilise le caractère "|" pour délimiter des champs de texte séparés ou des listes de mots dans les activités où les élèves doivent identifier et cliquer sur un nombre variable de mots. Le problème est que SSMS ne formate pas correctement les données du presse-papiers en utilisant un format CSV, avec des champs correctement cités et des guillemets échappés. De plus, Excel ne lit pas correctement les données CSV, ignore les séquences d'échappement et utilise un format de délimitation simpliste qui n'est pas conforme aux spécifications CSV.

0 votes

La seule véritable solution de contournement est d'utiliser SSMS 2008, et d'utiliser Open Office CALC pour le chargement et l'enregistrement des CSV, car cela fonctionne parfaitement.

0voto

Scott Thornton Points 3

J'ai rencontré le même problème. J'ai pu obtenir mes résultats dans un CSV en utilisant la solution suivante :

  1. Exécuter la requête
  2. Cliquez à droite dans le coin supérieur gauche de la grille de résultats.
  3. Sélectionnez "Enregistrer les résultats sous "
  4. Choisissez csv et viola !

0 votes

Cela ne met pas les dates/heures dans un format utile pour un tableur et n'inclut pas les en-têtes. Elle garde les données multi-lignes dans la même ligne, ce qui répond à la question initiale, mais comme elle introduit potentiellement d'autres problèmes, je ne peux pas me sentir bien en l'approuvant.

2 votes

Désolé, cela ne fonctionne pas, les nouvelles lignes/retours de chariot sont toujours traités en divisant la ligne en plusieurs lignes.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X