638 votes

Comment insérer un saut de ligne dans une chaîne VARCHAR/NVARCHAR de SQL Server

Je n'ai pas vu de questions similaires posées sur ce sujet, et j'ai dû faire des recherches pour un projet sur lequel je travaille actuellement. J'ai pensé poster la réponse au cas où quelqu'un d'autre aurait la même question.

9 votes

Pour tester votre sortie, si vous utilisez SSMS, assurez-vous que l'option Retain CR/LF on copy or save est cochée, sinon tous les résultats collés perdront le saut de ligne. Vous trouverez cette option dans Paramètres, Résultats de la requête, Serveur SQL, Résultats dans la grille.

1 votes

@StefanosZilellis et assurez-vous d'ouvrir une nouvelle fenêtre de requête pour que les changements de paramètres prennent effet.

669voto

Sören Kuklau Points 9445

char(13) est CR . Pour le style DOS/Windows CRLF les sauts de ligne, vous voulez char(13)+char(10) comme :

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'

33 votes

Char(13)+char(10) n'a pas fonctionné pour moi sous Windows. J'ai juste utilisé char(10)

6 votes

@Nima : Certaines applications utiliseront l'un ou l'autre, ou les deux, pour indiquer une nouvelle ligne, mais de nombreuses applications auxquelles vous pouvez envoyer ce texte exigeront que les deux apparaissent successivement pour signifier une nouvelle ligne. Je trouve qu'il est plus sûr d'utiliser les deux. Vous pouvez indiquer ici pour quelles applications cela ne fonctionne pas. Je préfère moi-même les valeurs hexadécimales CHAR(0x0D) + CHAR(0x0A), mais chacun y trouve son compte.

2 votes

J'ai utilisé cette méthode avec succès, mais j'ai rencontré un problème : dès que vous avez plus d'environ 480 + le serveur SQL commencera à se plaindre que votre requête est trop profondément imbriquée. Ma solution était plutôt d'utiliser la réponse de Rob Cooper, mais avec un jeton beaucoup plus long et plus obscur.

320voto

Mark Struzinski Points 11288

J'ai trouvé la réponse ici : http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-à-insérer-carriage-return-et-new-line-feed-in-code/

Il suffit de concaténer la chaine et d'insérer un CHAR(13) où vous voulez votre saut de ligne.

Exemple :

DECLARE @text NVARCHAR(100)
SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'
SELECT @text

Le résultat est le suivant :

Il s'agit de la ligne 1.
Il s'agit de la ligne 2.

1 votes

Mais comment le faire de manière programmatique ? Disons à partir de C# ?

13 votes

MISE À JOUR : oubliez-le. Il s'insère très bien. C'est le studio de gestion qui remplace les tabulations et les retours à la ligne par des espaces pour plus de visibilité.

15 votes

Il semble que vous deviez utiliser PRINT @text plutôt que SELECT pour obtenir ce résultat.

97voto

Frank V Points 9690

Une autre façon de procéder est la suivante :

INSERT CRLF SELECT 'fox 
jumped'

En d'autres termes, il suffit d'insérer un saut de ligne dans votre requête pendant que vous l'écrivez pour que le même saut soit ajouté à la base de données. Cela fonctionne dans SQL server Management studio et Query Analyzer. Je pense que cela fonctionnera également en C# si vous utilisez le signe @ sur les chaînes de caractères.

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"

Regards,
Frank

14 votes

En d'autres termes, la syntaxe du langage SQL autorise simplement les sauts de ligne bruts dans les chaînes de caractères. Cela fonctionne de cette façon dans tous les moteurs que j'ai essayés (SQL Server, Oracle, MySQL, PostgreSQL et SQLite).

0 votes

Parfois, cela cesse de fonctionner de manière aléatoire si vous l'utilisez dans des procédures stockées.

0 votes

C'était une solution simple et élégante.

18voto

Rob Cooper Points 15945

Suite à un Google ...

Je prends le code du site web :

CREATE TABLE CRLF
    (
        col1 VARCHAR(1000)
    )

INSERT CRLF SELECT 'The quick brown@'
INSERT CRLF SELECT 'fox @jumped'
INSERT CRLF SELECT '@over the '
INSERT CRLF SELECT 'log@'

SELECT col1 FROM CRLF

Returns:

col1
-----------------
The quick brown@
fox @jumped
@over the
log@

(4 row(s) affected)

UPDATE CRLF
SET col1 = REPLACE(col1, '@', CHAR(13))

On dirait que cela peut être fait en remplaçant un espace réservé par CHAR(13)

Bonne question, je ne l'ai jamais fait moi-même :)

4 votes

Mais si le texte contient une adresse électronique ? "jon@bob.com" devient "jon bob.com" (avec un saut de ligne dans l'adresse électronique)

4 votes

@ChrisNash, utilisez alors un autre caractère de remplacement (par exemple "|", "~" ou plusieurs caractères, "!# !"). Voir cette réponse ci-dessous : stackoverflow.com/a/31179/179311 .

1 votes

"CONCAT (CHAR(13) , CHAR(10))" (" \r\n ") serait plus adapté à l'environnement Windows, ce qui, je suppose, est le cas (SQL Server). cs.toronto.edu/~krueger/csc209h/tut/fin-de-ligne.html

12voto

Bruce Allen Points 61

Je suis venu ici parce que j'étais préoccupé par le fait que les cr-lfs que je spécifiais dans les chaînes C# n'apparaissaient pas dans les réponses aux requêtes de SQl Server Management Studio.

Il s'avère qu'ils sont là, mais qu'ils ne sont pas affichés.

Pour "voir" les cr-lfs, utilisez l'instruction print comme :

déclarer @tmp varchar(500)

select @tmp = msgbody from emailssentlog where id=6769

imprimer @tmp

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