Come inserire un'interruzione di riga in una stringa VARCHAR / NVARCHAR di SQL Server


562

Non ho visto domande simili su questo argomento e ho dovuto cercare questo per qualcosa a cui sto lavorando in questo momento. Ho pensato di pubblicare la risposta nel caso in cui qualcun altro avesse avuto la stessa domanda.


8
Per testare l'output, se si utilizza SSMS assicurarsi che l'opzione Mantieni CR / LF su copia o salvataggio sia selezionata, altrimenti tutti i risultati incollati perderanno l'alimentazione di riga. Lo trovi in ​​impostazioni, risultati della query, server sql, risultati nella griglia.
Stefanos Zilellis,

1
@StefanosZilellis e assicurati di aprire una nuova finestra di query per rendere effettive le modifiche alle impostazioni.
Don Cheadle,

Risposte:


597

char(13)lo è CR. Per stile Windows DOS / CRLFinterruzioni di linea, che volete char(13)+char(10), come:

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

28
char (13) + char (10) non ha funzionato per me in Windows. Ho appena usato char (10)
nima l'

6
@Nima: alcune applicazioni useranno l'una o l'altra o entrambe per mostrare una nuova riga, tuttavia molte applicazioni per le quali è possibile emettere questo testo richiedono che entrambe vengano visualizzate in successione per indicare una nuova riga. Trovo sicuro usare entrambi. Puoi elencare qui per quale delle tue app non funziona. Preferisco io stesso i valori esadecimali CHAR (0x0D) + CHAR (0x0A), ma a ciascuno il proprio.
MikeTeeVee,

2
Ho usato questo metodo con successo, ma ho riscontrato un problema con esso: una volta che ne hai più di 480 +, SQL Server inizierà a lamentarsi che la tua query è nidificata troppo profondamente. La mia soluzione era invece quella di utilizzare la risposta di Rob Cooper, ma con un token molto più lungo e più oscuro.
Marcus Downing,

5
Fornire \ r \ n significherebbe riconoscere l'esistenza di espressioni regolari e che ci sono utenti in grado di comprenderle e usarle.
wwmbes

10
@HBlackorby \ re \ n precedono Java-nulla da decenni con il loro uso in C; e sono standard in Python, PHP, Ruby, C ++, C #, ecc ...
Uueerdo,

286

Ho trovato la risposta qui: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in- codice/

Basta concatenare la stringa e inserire un punto in CHAR(13)cui si desidera interrompere la linea.

Esempio:

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

Questo stampa quanto segue:

Questa è la linea 1.
Questa è la linea 2.


11
AGGIORNAMENTO: dimenticalo. Si inserisce bene. È lo studio di gestione quello che sostituisce le schede e le nuove righe con spazi per la visibilità
Daniel Dolz,

12
Sembra che tu debba usare PRINT @text piuttosto che SELECT per ottenere questo risultato.
QMaster

3
A proposito: puoi anche usare NCHAR(0x1234)per ottenere un carattere unicode. Non è necessario per inserire interruzioni di riga, ma può tornare utile se è necessario inserire / cercare caratteri unicode.
Paul Groke,

3
In SQL Server 2016, vedo solo stampare le due righe se uso printinvece di select, come ad esempio:DECLARE @text NVARCHAR(100); SET @text = 'This is line 1.' + CHAR(13) + 'This is line 2.'; print @text;
devinbost

7
Per testare l'output, se si utilizza SSMS assicurarsi che l'opzione Mantieni CR / LF su copia o salvataggio sia selezionata, altrimenti tutti i risultati incollati perderanno l'alimentazione di riga. Lo trovi in ​​impostazioni, risultati della query, server sql, risultati nella griglia.
Don Cheadle,

81

Un altro modo per farlo è come tale:

INSERT CRLF SELECT 'fox 
jumped'

Cioè, semplicemente inserendo un'interruzione di riga nella query durante la scrittura, si aggiungerà un'interruzione simile al database. Funziona con SQL Server Management Studio e Query Analyzer. Credo che funzionerà anche in C # se usi il segno @ sulle stringhe.

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

14
In altre parole, la sintassi del linguaggio SQL consente semplicemente avanzamenti di riga non elaborati in valori letterali di stringhe. Funziona in questo modo su tutti i motori che ho provato (SQL Server, Oracle, MySQL, PostgreSQL e SQLite).
Álvaro González,

a volte questo smette di funzionare in modo casuale se lo si utilizza in stored procedure
DaFi4

25

Esegui questo in SSMS, mostra come le interruzioni di riga nello stesso SQL diventano parte di valori di stringa che si estendono su linee:

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

Risultato:
linea 1
linea 2
linea 3

Quanto dura un feed di riga vuota?
2

Quali sono i valori ASCII?
13
10

Oppure, se preferisci specificare la stringa su una riga (quasi!), Potresti utilizzare in REPLACE()questo modo (facoltativamente utilizzare CHAR(13)+CHAR(10)come sostituzione):

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

16

A seguito di un Google ...

Prendendo il codice dal sito 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))

Sembra che possa essere fatto sostituendo un segnaposto con CHAR (13)

Bella domanda, non l'ho mai fatto da solo :)


4
Ma se il testo contiene un indirizzo e-mail? "jon@bob.com" diventa "jon bob.com" (con una nuova riga nell'e-dress)
intrepidis,

4
@ChrisNash utilizza quindi un segnaposto diverso (ad esempio "|", "~" o più caratteri, "! #!"). Vedi questa risposta di seguito: stackoverflow.com/a/31179/179311 .
bradlis7,

1
"CONCAT (CHAR (13), CHAR (10))" ("\ r \ n") sarebbe meglio per l'ambiente Windows, che presumo sia il caso (SQL Server) cs.toronto.edu/~krueger/csc209h/ tut / line-endings.html
d.popov

12

Sono arrivato qui perché ero preoccupato che cr-lfs che avevo specificato nelle stringhe C # non venisse mostrato nelle risposte alle query di SQl Server Management Studio.

Si scopre che sono lì, ma non vengono visualizzati.

Per "vedere" cr-lfs, usa l'istruzione print come:

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

4

Ecco una funzione C # che antepone una riga di testo a un BLOB di testo esistente, delimitato da CRLF e restituisce un'espressione T-SQL adatta per INSERTo UPDATEoperazioni. Ci sono alcuni dei nostri errori proprietari nella gestione, ma una volta che lo hai strappato fuori, potrebbe essere utile - lo spero.

/// <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("");
    }
}

4

direi

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

o

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

3

Questo è sempre interessante, perché quando si ottengono elenchi esportati da, diciamo Oracle, si ottengono record che si estendono su più righe, il che a sua volta può essere interessante per, diciamo, i file cvs, quindi attenzione.

Ad ogni modo, la risposta di Rob è buona, ma consiglierei di usare qualcos'altro oltre a @, provane un po 'di più, come §§ @@ §§ o qualcosa del genere, quindi avrà una possibilità per un po' di unicità. (Tuttavia, ricorda la lunghezza del campo varchar/ nvarcharche stai inserendo ..)


3

Tutte queste opzioni funzionano a seconda della situazione, ma potresti non vederle funzionare se stai usando SSMS (come menzionato in alcuni commenti SSMS nasconde CR / LF)

Quindi, invece di guidare te stesso dietro la curva, controlla questa impostazione

Tools | Options

che sostituirà il

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.