704 Stimmen

Einfügen eines Zeilenumbruchs in eine SQL Server VARCHAR/NVARCHAR-Zeichenfolge

Ich habe nicht gesehen, dass ähnliche Fragen zu diesem Thema gestellt wurden, und ich musste dies für etwas recherchieren, an dem ich gerade arbeite. Ich dachte, ich würde die Antwort darauf posten, falls jemand anderes die gleiche Frage hat.

12 Stimmen

Um Ihre Ausgabe zu testen, vergewissern Sie sich bei Verwendung von SSMS, dass die Option CR/LF beim Kopieren oder Speichern beibehalten aktiviert ist, da sonst alle eingefügten Ergebnisse den Zeilenvorschub verlieren. Sie finden diese Option unter Einstellungen, Abfrageergebnisse, Sql-Server, Ergebnisse in Gitter.

3 Stimmen

@StefanosZilellis und stellen Sie sicher, dass Sie ein neues Abfragefenster öffnen, damit die Einstellungsänderungen wirksam werden.

736voto

Sören Kuklau Punkte 18696

char(13) est CR . Für DOS-/Windows-Stil CRLF Zeilenumbrüche, Sie wollen char(13)+char(10) , wie:

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

38 Stimmen

Char(13)+char(10) hat bei mir unter Windows nicht funktioniert. Ich habe einfach char(10) verwendet.

8 Stimmen

@Nima: Einige Anwendungen verwenden entweder das eine oder das andere oder beide, um eine neue Zeile anzuzeigen, aber viele Anwendungen, für die Sie diesen Text ausgeben, verlangen, dass beide nacheinander erscheinen, um eine neue Zeile zu signalisieren. Ich halte es für sicher, beide zu verwenden. Sie können hier auflisten, für welche Ihrer Anwendungen es nicht funktioniert. Ich selbst bevorzuge die hexadezimalen Werte CHAR(0x0D) + CHAR(0x0A), aber jedem das Seine.

2 Stimmen

Ich habe diese Methode erfolgreich angewandt, bin dabei aber auf ein Problem gestoßen: Sobald man mehr als etwa 480 + wird sich SQL Server beschweren, dass Ihre Abfrage zu tief verschachtelt ist. Meine Lösung bestand darin, stattdessen die Antwort von Rob Cooper zu verwenden, allerdings mit einem viel längeren und obskureren Token.

346voto

Mark Struzinski Punkte 32275

Ich habe die Antwort hier gefunden: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in-code/

Sie verketten einfach die Zeichenfolge und fügen ein CHAR(13) wo der Zeilenumbruch erfolgen soll.

Beispiel:

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

Es wird Folgendes ausgedruckt:

Dies ist Zeile 1.
Dies ist Zeile 2.

1 Stimmen

Aber wie kann man das programmatisch machen? Sagen wir von c# aus?

14 Stimmen

UPDATE: Vergessen Sie es. Es lässt sich problemlos einfügen. Es ist das Management-Studio, das Tabulatoren und Zeilenumbrüche aus Gründen der Sichtbarkeit durch Leerzeichen ersetzt

22 Stimmen

Es scheint, dass Sie PRINT @text statt SELECT verwenden müssen, um dieses Ergebnis zu erhalten.

106voto

Frank V Punkte 24349

Eine andere Möglichkeit besteht darin, dies so zu tun:

INSERT CRLF SELECT 'fox 
jumped'

Das heißt, wenn Sie beim Schreiben Ihrer Abfrage einen Zeilenumbruch einfügen, wird dieser in die Datenbank übernommen. Dies funktioniert in SQL Server Management Studio und Query Analyzer. Ich glaube, dies funktioniert auch in C#, wenn Sie das @-Zeichen für Strings verwenden.

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

17 Stimmen

Mit anderen Worten, die Syntax der SQL-Sprache erlaubt einfach rohe Zeilenvorschübe in String-Literalen. Das funktioniert in allen Engines, die ich ausprobiert habe (SQL Server, Oracle, MySQL, PostgreSQL und SQLite).

0 Stimmen

Manchmal funktioniert dies zufällig nicht mehr, wenn man es in gespeicherten Prozeduren verwendet

0 Stimmen

Dies war eine einfache und elegante Lösung.

64voto

Trubs Punkte 2445

Alle diese Optionen sind je nach Situation möglich, aber Wenn Sie SSMS verwenden, funktioniert möglicherweise keine von ihnen. (wie in einigen Kommentaren erwähnt, blendet SSMS CR/LFs aus)

Anstatt sich selbst in die Enge zu treiben, sollten Sie diese Einstellung überprüfen

Tools | Options

which will replace the

8 Stimmen

Ich verwende SSMS Version 18.2 und hatte Probleme, diese Einstellung zu aktivieren. Ich musste sie aktivieren, dann SSMS beenden und neu starten. Und stellen Sie sicher, dass Sie nur 1 Instanz von SSMS laufen haben. Die zweite Instanz wird die Einstellung mit dem ursprünglichen Wert überschreiben. Aber schließlich war ich erfolgreich. +1

4 Stimmen

Beachten Sie auch, dass bei der Ausgabe in Text statt in Raster die CR/LF wie erwartet beibehalten werden, ohne dass Sie Änderungen an den Anwendungsoptionen vornehmen müssen.

4 Stimmen

Erfordert einen Neustart von SSMS, damit diese Änderung wirksam wird.

36voto

AjV Jsy Punkte 5481

Führen Sie dies in SSMS aus. Es zeigt, wie Zeilenumbrüche in der SQL selbst Teil von String-Werten werden, die sich über Zeilen erstrecken:

PRINT 'Line 1
Line 2
Line 3'
PRINT ''

PRINT 'How long is a blank line feed?'
PRINT LEN('
')
PRINT ''

PRINT 'What are the ASCII values?'
PRINT ASCII(SUBSTRING('
',1,1))
PRINT ASCII(SUBSTRING('
',2,1))

Ergebnis :
Zeile 1
Zeile 2
Zeile 3

Wie lang ist ein Leerzeilenvorschub?
2

Was sind die ASCII-Werte?
13
10

Wenn Sie Ihre Zeichenkette lieber in einer Zeile angeben möchten (fast!), können Sie auch REPLACE() wie folgt (optional können Sie CHAR(13)+CHAR(10) als Ersatz) :

PRINT REPLACE('Line 1`Line 2`Line 3','`','
')

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X