Question

Je n'ai vu aucune question similaire posée sur ce sujet et j'ai dû faire des recherches sur quelque chose sur lequel je travaille actuellement.Je pensais que je publierais la réponse au cas où quelqu'un d'autre aurait la même question.

Était-ce utile?

La solution 2

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 venez de concaténer la chaîne et d'insérer 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.
C'est la ligne 2.

Autres conseils

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

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

Une autre façon de procéder est la suivante :

INSERT CRLF SELECT 'fox 
jumped'

Autrement dit, le simple fait d'insérer un saut de ligne dans votre requête lors de son écriture ajoutera le même saut à la base de données.Cela fonctionne dans SQL Server Management Studio et Query Analyzer.Je pense que cela fonctionnera également en C# si vous utilisez le signe @ sur les chaînes.

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

Exécutez ceci dans SSMS, cela montre comment les sauts de ligne dans le SQL lui-même font partie des valeurs de chaîne qui s'étendent sur 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

Quelle est la durée d’un saut de ligne vierge ?
2

Quelles sont les valeurs ASCII ?
13
10

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

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

Suite à un Google...

En reprenant 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, je ne l'ai jamais fait moi-même :)

Je suis arrivé ici parce que je craignais que les cr-lfs que j'avais spécifiés dans les chaînes C# n'étaient pas affichés dans les réponses aux requêtes SQL Server Management Studio.

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

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

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

Voici une fonction C# qui ajoute une ligne de texte à un objet blob de texte existant, délimité par des CRLF, et renvoie une expression T-SQL adaptée à INSERT ou UPDATE opérations.Il contient une partie de notre gestion exclusive des erreurs, mais une fois que vous l'avez extrait, 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("");
    }
}

Je dirais

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

ou

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

C'est toujours cool, car lorsque vous obtenez des listes exportées depuis, par exemple, Oracle, vous obtenez des enregistrements s'étendant sur plusieurs lignes, ce qui à son tour peut être intéressant pour, par exemple, des fichiers cvs, alors méfiez-vous.

Quoi qu'il en soit, la réponse de Rob est bonne, mais je conseillerais d'utiliser autre chose que @, d'en essayer quelques-uns de plus, comme §§@@§§ ou quelque chose du genre, afin qu'il ait une chance d'être unique.(Mais rappelez-vous quand même la longueur du varchar/nvarchar champ dans lequel vous insérez ..)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top