So fügen Sie einen Zeilenumbruch in eine SQL Server VARCHAR/NVARCHAR-Zeichenfolge ein

StackOverflow https://stackoverflow.com/questions/31057

  •  09-06-2019
  •  | 
  •  

Frage

Ich habe keine ähnlichen Fragen zu diesem Thema gesehen und musste hier nach etwas suchen, an dem ich gerade arbeite.Ich dachte, ich würde die Antwort darauf posten, falls jemand anderes die gleiche Frage hätte.

War es hilfreich?

Lösung 2

Die Antwort habe ich 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 eine ein CHAR(13) wo Sie Ihren Zeilenumbruch wünschen.

Beispiel:

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

Dies gibt Folgendes aus:

Das ist Zeile 1.
Das ist Zeile 2.

Andere Tipps

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

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

Eine andere Möglichkeit, dies zu tun, ist folgende:

INSERT CRLF SELECT 'fox 
jumped'

Das heißt, wenn Sie während des Schreibens einfach einen Zeilenumbruch in Ihre Abfrage einfügen, wird der entsprechende Umbruch zur Datenbank hinzugefügt.Dies funktioniert in SQL Server Management Studio und Query Analyzer.Ich glaube, dass dies auch in C# funktionieren wird, wenn Sie das @-Zeichen für Zeichenfolgen verwenden.

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

Führen Sie dies in SSMS aus. Es zeigt, wie Zeilenumbrüche in der SQL selbst Teil von Zeichenfolgenwerten 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 :
Linie 1
Zeile 2
Zeile 3

Wie lang ist ein Leerzeilenvorschub?
2

Was sind die ASCII-Werte?
13
10

Oder wenn Sie Ihre Zeichenfolge lieber (fast!) in einer Zeile angeben möchten, können Sie diese verwenden REPLACE() so (optional verwenden CHAR(13)+CHAR(10) als Ersatz):

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

Im Anschluss an a Google...

Den Code von der Website übernehmen:

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

Sieht so aus, als ob dies durch Ersetzen eines Platzhalters durch erreicht werden kann CHAR(13)

Gute Frage, habe es selbst noch nie gemacht :)

Ich bin hierher gekommen, weil ich befürchtete, dass cr-lfs, die ich in C#-Strings angegeben habe, nicht in den Abfrageantworten von SQL Server Management Studio angezeigt würden.

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

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

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

Hier ist eine C#-Funktion, die einem vorhandenen, durch CRLFs getrennten Textblob eine Textzeile voranstellt und einen geeigneten T-SQL-Ausdruck zurückgibt INSERT oder UPDATE Operationen.Es enthält einige unserer proprietären Fehlerbehandlungsfunktionen, aber sobald Sie diese herausgerissen haben, kann 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("");
    }
}

ich würde sagen

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

oder

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

Das ist immer cool, denn wenn Sie exportierte Listen beispielsweise von Oracle erhalten, erhalten Sie Datensätze, die sich über mehrere Zeilen erstrecken, was wiederum beispielsweise für CVS-Dateien interessant sein kann. Seien Sie also vorsichtig.

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top