Hoe een lijnvakantie in een SQL Server varchar / Nvarchar String

Ik heb geen soortgelijke vragen over dit onderwerp gezien, en ik moest dit onderzoeken voor iets waar ik nu aan werk. Dacht dat ik het antwoord ervoor zou plaatsen voor het geval iemand anders dezelfde vraag had.


Antwoord 1, Autoriteit 100%

char(13)is CR. Voor DOS- / Windows-stijl CRLFLINEBREAKS, U wilt CHAR(13)+CHAR(10), zoals:

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

Antwoord 2, Autoriteit 48%

Ik vond hier het antwoord: http://blog.sqlauthority.com/2007/08/22/SQL-SERVER-T-SQL-Script-TO-InSert-carriage-Return -en-new-line-feed-in-code /

U concateren gewoon de tekenreeks en plaats een char(13)waar u uw lijnvakantie wilt.

Voorbeeld:

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

Dit drukt het volgende af:

Dit is lijn 1.
Dit is lijn 2.


Antwoord 3, Autoriteit 15%

Een andere manier om dit te doen is als zodanig:

INSERT CRLF SELECT 'fox 
jumped'

Dat wil zeggen, gewoon een lijnbraak in uw zoekopdracht plaatsen tijdens het schrijven, het zal de like pauze toevoegen aan de database. Dit werkt in SQL Server Management Studio en Query Analyzer. Ik geloof dat dit ook in C # zal werken als je het @ teken op snaren gebruikt.

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

Antwoord 4, autoriteit 4%

Voer dit uit in SSMS, het laat zien hoe regeleinden in de SQL zelf onderdeel worden van tekenreekswaarden die regels overspannen:

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

Resultaat:
Lijn 1
Lijn 2
Lijn 3

Hoe lang is een lege regelinvoer?
2

Wat zijn de ASCII-waarden?
13
10

Of als u uw string liever op één regel specificeert (bijna!) kunt u REPLACE()op deze manier gebruiken (gebruik optioneel CHAR(13)+CHAR(10)als vervanging) :

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

Antwoord 5, autoriteit 3%

Al deze opties werken afhankelijk van uw situatie, maar het kan zijn dat u geen van deze opties ziet werken als u SSMS gebruikt(zoals vermeld in sommige opmerkingen SSMS verbergt CR/LF’s)

Dus in plaats van zelf door de bocht te rijden, controleer deze instelling in

Tools|Options

. zal vervangen


Antwoord 6, autoriteit 3%

Na een Google

De code van de website halen:

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

Het lijkt erop dat dit kan worden gedaan door een tijdelijke aanduiding te vervangen door CHAR(13)

Goede vraag, heb het zelf nooit gedaan 🙂


Antwoord 7, autoriteit 2%

Ik kwam hier omdat ik bang was dat cr-lfs die ik in C#-tekenreeksen had opgegeven, niet werden weergegeven in query-antwoorden van SQL Server Management Studio.

Het blijkt dat ze er zijn, maar niet worden weergegeven.

Om de cr-lfs te “zien”, gebruikt u de printopdracht zoals:

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

Antwoord 8

Ik zou zeggen

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

of

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

Antwoord 9

Hier is een C#-functie die een tekstregel voor een bestaande tekstblob plaatst, gescheiden door CRLF’s, en een T-SQL-expressie retourneert die geschikt is voor INSERT– of UPDATE-bewerkingen. Er zit een deel van onze eigen foutafhandeling in, maar als je dat er eenmaal uithaalt, kan het nuttig zijn — ik hoop het.

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

Antwoord 10

Dit is altijd cool, want wanneer u wordt geëxporteerd lijsten van, zeg Oracle, dan krijg je records die verschillende regels spannen, die op zijn beurt interessant kunnen zijn voor, zeggen, CVS-bestanden, dus pas op.

Hoe dan ook, het antwoord van Rob is goed, maar ik zou het adviseren met iets anders dan @, probeer er nog een paar, zoals §§ @@ §§ of iets, dus het zal een kans krijgen voor een uniekheid. (Onthoud nog steeds de lengte van de varchar/ nvarcharVELD U INSTELT IN ..)


Antwoord 11

In sommige speciale gevallen vindt u deze handige (bijvoorbeeld het weergeven van cel-inhoud in MS-rapport)

Voorbeeld:

select * from 
(
values
    ('use STAGING'),
    ('go'),
    ('EXEC sp_MSforeachtable 
@command1=''select ''''?'''' as tablename,count(1) as anzahl from  ? having count(1) = 0''')
) as t([Copy_and_execute_this_statement])
go

Other episodes