Comment insérer un saut de ligne dans une chaîne SQL Server VARCHAR / nvarchar

Je n'ai pas vu de questions similaires posées sur ce sujet, et j'ai dû faire des recherches pour quelque chose sur lequel je travaille en ce moment. Je pensais que je posterais la réponse au cas où quelqu'un d'autre aurait la même question.

437
demandé sur Csharp 2008-08-27 23:53:01

8 réponses

char(13) est CR. Pour les sauts de ligne de style DOS/Windows CRLF, vous voulez char(13)+char(10), comme:

'This is line 1.' + CHAR(13)+CHAR(10) + 'This is line 2.'
476
répondu Sören Kuklau 2008-08-27 20:25:14

J'ai trouvé la réponse ici: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in-code/

Vous concaténez simplement la chaîne et insérez un CHAR(13) où vous voulez votre saut de ligne.

Exemple:

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

Cela imprime ce qui suit:

C'est la ligne 1.
Ici la ligne 2.

237
répondu Mark Struzinski 2012-04-03 23:25:21

Une autre façon de le faire est en tant que telle:

INSERT CRLF SELECT 'fox 
jumped'

C'est-à-dire que le simple fait d'insérer un saut de ligne dans votre requête en l'écrivant ajoutera le saut like À La base de données. Cela fonctionne dans SQL server Management studio et Query Analyzer. Je crois que cela fonctionnera également en C # si vous utilisez le signe @ sur les chaînes.

string str = @"INSERT CRLF SELECT 'fox 
    jumped'"
67
répondu Frank V 2016-06-22 17:30:59

Exécutez ceci dans SSMS, il montre comment les sauts de ligne dans le SQL lui-même font partie des valeurs de chaîne qui couvrent les lignes:

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

Résultat :
Ligne 1
Ligne 2
Ligne 3

Combien de temps dure un saut de ligne vide?
2

Quelles sont les valeurs ASCII?
13
10

Ou si vous préférez spécifier votre chaîne sur une ligne (presque!), vous pourriez employer REPLACE() comme ceci (éventuellement utiliser CHAR(13)+CHAR(10), comme le remplacement) :

PRINT REPLACE('Line 1`Line 2`Line 3','`','
')
14
répondu AjV Jsy 2015-09-17 15:13:05

Suite à un Google ...

Prendre le code du site 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))

On dirait que cela peut être fait en remplaçant un espace réservé par CHAR(13)

Bonne question, jamais fait moi-même :)

13
répondu Rob Cooper 2008-08-27 19:56:30

Je suis arrivé ici parce que je craignais que cr-lfs que j'ai spécifié dans les chaînes C# ne soient pas affichées dans les réponses de requête SQl Server Management Studio.

, Il s'avère, ils sont là, mais ne sont pas affichées.

Pour "voir" le CR-lfs, utilisez l'instruction print comme:

declare @tmp varchar(500)    
select @tmp = msgbody from emailssentlog where id=6769;
print @tmp
11
répondu Bruce Allen 2014-12-24 06:29:41

Voici une fonction C# qui ajoute une ligne de texte à un blob de texte existant, délimité par CRLFs, et renvoie une expression T-SQL adaptée aux opérations INSERT ou UPDATE. Il y a une partie de notre gestion des erreurs propriétaires, mais une fois que vous l'avez déchiré, cela peut être utile-je l'espère.

/// <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("");
    }
}
3
répondu Carl Niedner 2018-09-13 09:42:28

C'est toujours cool, Car lorsque vous obtenez des listes exportées à partir, disons Oracle, vous obtenez des enregistrements couvrant plusieurs lignes, ce qui peut être intéressant pour, disons, les fichiers cvs, alors méfiez-vous.

De toute façon, la réponse de Rob est bonne, mais je conseillerais d'utiliser autre chose que @, essayez un peu plus, comme §§@@§§ ou quelque chose, donc il aura une chance pour une certaine unicité. (Mais encore, rappelez-vous la longueur de la varchar/nvarchar champ dans lequel vous insérez..)

2
répondu neslekkiM 2013-06-18 15:20:14