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.

18voto

Rob Cooper Punkte 28132

Nach einer Google ...

Ich nehme den Code von der Website:

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))

Es sieht so aus, als ob es möglich ist, einen Platzhalter zu ersetzen durch CHAR(13)

Gute Frage, ich habe es selbst nie gemacht :)

4 Stimmen

Aber wenn der Text eine E-Mail-Adresse enthält? "jon@bob.com" wird zu "jon bob.com" (mit einem Zeilenumbruch in der E-Adresse)

4 Stimmen

@ChrisNash dann einen anderen Platzhalter verwenden (z. B. "|", "~" oder mehrere Zeichen, "!#!"). Siehe diese Antwort unten: stackoverflow.com/a/31179/179311 .

1 Stimmen

"CONCAT (CHAR(13) , CHAR(10))" (" \r\n ") wäre für eine Windows-Umgebung besser, wovon ich annehme, dass dies der Fall ist (SQL Server) cs.toronto.edu/~krueger/csc209h/tut/line-endings.html

14voto

Ken Kin Punkte 4321

Ich würde sagen

concat('This is line 1.', 0xd0a, 'This is line 2.')

o

concat(N'This is line 1.', 0xd000a, N'This is line 2.')

2 Stimmen

Überprüfen Sie auch die SSMS-Konfiguration in @Trubs Antwort: stackoverflow.com/a/59189881/386619

0 Stimmen

@JayCummins :o ?

13voto

Bruce Allen Punkte 181

Ich kam hierher, weil ich besorgt war, dass cr-lfs, die ich in C#-Zeichenfolgen angegeben wurden nicht in SQl Server Management Studio Abfrageantworten angezeigt werden.

Es stellt sich heraus, dass sie zwar vorhanden sind, aber nicht angezeigt werden.

Um die cr-lfs zu "sehen", verwenden Sie die Anweisung print wie folgt:

declare @tmp varchar(500)    
select @tmp = msgbody from emailssentlog where id=6769;
print @tmp

5voto

Carl Niedner Punkte 173

Hier ist eine C#-Funktion, die eine Textzeile an einen bestehenden Textblob anhängt, der durch CRLFs begrenzt ist, und einen T-SQL-Ausdruck zurückgibt, der für INSERT o UPDATE Operationen. Es enthält einige unserer proprietären Fehlerbehandlungen, aber wenn Sie das herausnehmen, könnte es hilfreich sein - ich hoffe es.

/// <summary>
/// Generate a SQL string value expression suitable for INSERT/UPDATE operations that prepends
/// the specified line to an existing block of text, assumed to have \r\n delimiters, and
/// truncate at a maximum length.
/// </summary>
/// <param name="sNewLine">Single text line to be prepended to existing text</param>
/// <param name="sOrigLines">Current text value; assumed to be CRLF-delimited</param>
/// <param name="iMaxLen">Integer field length</param>
/// <returns>String: SQL string expression suitable for INSERT/UPDATE operations.  Empty on error.</returns>
private string PrependCommentLine(string sNewLine, String sOrigLines, int iMaxLen)
{
    String fn = MethodBase.GetCurrentMethod().Name;

    try
    {
        String [] line_array = sOrigLines.Split("\r\n".ToCharArray());
        List<string> orig_lines = new List<string>();
        foreach(String orig_line in line_array) 
        { 
            if (!String.IsNullOrEmpty(orig_line))  
            {  
                orig_lines.Add(orig_line);    
            }
        } // end foreach(original line)

        String final_comments = "'" + sNewLine + "' + CHAR(13) + CHAR(10) ";
        int cum_length = sNewLine.Length + 2;
        foreach(String orig_line in orig_lines)
        {
            String curline = orig_line;
            if (cum_length >= iMaxLen) break;                // stop appending if we're already over
            if ((cum_length+orig_line.Length+2)>=iMaxLen)    // If this one will push us over, truncate and warn:
            {
                Util.HandleAppErr(this, fn, "Truncating comments: " + orig_line);
                curline = orig_line.Substring(0, iMaxLen - (cum_length + 3));
            }
            final_comments += " + '" + curline + "' + CHAR(13) + CHAR(10) \r\n";
            cum_length += orig_line.Length + 2;
        } // end foreach(second pass on original lines)

        return(final_comments);

    } // end main try()
    catch(Exception exc)
    {
        Util.HandleExc(this,fn,exc);
        return("");
    }
}

3voto

neslekkiM Punkte 683

Das ist immer gut, denn wenn Sie exportierte Listen von, sagen wir, Oracle erhalten, dann erhalten Sie Datensätze, die sich über mehrere Zeilen erstrecken, was wiederum für, sagen wir, cvs-Dateien interessant sein kann, also Vorsicht.

Wie auch immer, Robs Antwort ist gut, aber ich würde raten, etwas anderes als @ zu verwenden, versuchen Sie es mit ein paar mehr, wie §§@@§§ oder so, damit es eine Chance auf Einzigartigkeit hat. (Aber denken Sie trotzdem an die Länge der varchar / nvarchar Feld, in das Sie einfügen )

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