Cum pentru a insera o linie într-un SQL Server VARCHAR/NVARCHAR string

Am't vedea orice întrebări similare întrebat pe acest subiect, și am avut de a cerceta acest ceva I'm acum. Crezut că voi posta raspunsul pentru cazul în care cineva a avut aceeași întrebare.

Comentarii la întrebare (2)

char(13) e "CR". Pentru DOS/Windows-stil CRLF linebreaks, vrei char(13)+char(10)`, cum ar fi:

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
Comentarii (7)
Soluția

Răspunsul l-am găsit aici: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in-code/

Ai înlănțui șir și introduce un CHAR(13)` în cazul în care doriți dvs. de linie.

Exemplu:

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

Acest lucru imprimă următoarele:

Aceasta este linia 1. Aceasta este linia 2.

Comentarii (7)

Un alt mod de a face acest lucru este ca atare:

INSERT CRLF SELECT 'fox 
jumped'

Asta este, pur și simplu introduceți o întrerupere de linie în interogare în timp ce scriu se va adăuga ca rupe la baza de date. Acest lucru funcționează în SQL server Management studio și Query Analyzer. Cred că acest lucru va lucra, de asemenea, în C# dacă utilizați semnul @ pe siruri de caractere.

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"
Comentarii (2)

Facem acest lucru în SSMS, arată cât de pauze de linie în SQL însăși a devenit parte din șirul de valori care se întind liniile :

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

Rezultatul : Linia 1 Linia 2 Linia 3

Cât timp este o linie goală alimentare? Două

Care sunt valorile ASCII? Treisprezece Zece

Sau daca'd mai degrabă să specificați un șir pe o linie (aproape!) ai putea angaja REPLACE() astfel (opțional folosi CHAR(13)+CHAR(10) ca înlocuitor) :

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

În urma unei Google...

Iei codul de pe site-ul:

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

Se pare ca acesta poate fi realizat prin înlocuirea unui substituent cu CHAR(13)

Bună întrebare, n-am făcut-o eu :)

Comentarii (4)

Am ajuns aici pentru că am fost îngrijorat de faptul că cr-lfs că am specificat în C# siruri de caractere nu au fost prezentate în SQl Server Management Studio interogare răspunsuri.

Se pare, ei sunt acolo, dar nu sunt afișate.

Pentru a "vad" cr-lfs, utilizați declarația de imprimare, cum ar fi:

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

Aici's o C# functie care adauga inaintea unei linii de text pentru un text existent blob, delimitată de CRLFs, și returnează un T-SQL expresie potrivite pentru "INSERT" sau "ACTUALIZARE" operațiuni. L's a primit unele dintre noastre de proprietate eroare de manipulare în ea, dar odată ce ați rupe asta, ar putea fi util ... eu asa sper.

/// 
/// 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.
/// 
/// <param name="sNewLine">Single text line to be prepended to existing textCurrent text value; assumed to be CRLF-delimitedInteger field 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("");
    }
}
Comentarii (0)

Acest lucru este întotdeauna rece, pentru că atunci când ai exportate liste de Oracle, atunci veți obține înregistrări întinde pe mai multe linii, care la rândul lor pot fi interesante pentru, să zicem, fișierele cvs, deci atentie.

Oricum, Rob's răspunsul este bun, dar te-aș sfătui folosind altceva decât @, încercați câteva mai mult, ca §§@@§§ sau ceva, așa că va avea o șansă pentru unele unicitatea. (Dar, totuși, amintiți-vă lungime de varchar/`nvarchar câmpul introduceți în..)

Comentarii (0)

Am'd spus

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

sau

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