Как вставить разрыв строки в строку SQL Server VARCHAR / NVARCHAR

StackOverflow https://stackoverflow.com/questions/31057

  •  09-06-2019
  •  | 
  •  

Вопрос

Я не видел, чтобы какие-либо подобные вопросы задавались по этой теме, и мне пришлось исследовать это для чего-то, над чем я сейчас работаю.Подумал, что опубликую ответ на этот вопрос на случай, если у кого-нибудь еще возникнет такой же вопрос.

Это было полезно?

Решение 2

Я нашел ответ здесь: http://blog.sqlauthority.com/2007/08/22/sql-server-t-sql-script-to-insert-carriage-return-and-new-line-feed-in-code/

Вы просто объединяете строку и вставляете CHAR(13) где вы хотите, чтобы ваш разрыв строки был.

Пример:

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

При этом выводится следующее:

Это строка 1.
Это строка 2.

Другие советы

char(13) является CR.Для DOS-/Windows-стиля CRLF лайнбрейки, ты хочешь char(13)+char(10), как:

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

Другой способ сделать это заключается в следующем:

INSERT CRLF SELECT 'fox 
jumped'

То есть, простая вставка разрыва строки в ваш запрос во время его написания добавит подобный разрыв в базу данных.Это работает в среде SQL Server Management Studio и анализаторе запросов.Я полагаю, что это также будет работать в C #, если вы используете @ sign в строках.

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

Запустите это в SSMS, это покажет, как разрывы строк в самом SQL становятся частью строковых значений, охватывающих строки :

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

Результат :
Строка 1
Строка 2
Строка 3

Как долго длится перевод пустой строки?
2

Каковы значения ASCII?
13
10

Или, если вы предпочитаете указать свою строку в одной строке (почти!), вы могли бы использовать REPLACE() вот так (необязательно использовать CHAR(13)+CHAR(10) в качестве замены) :

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

Следуя за Google...

Берем код с веб-сайта:

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

Похоже, это можно сделать, заменив заполнитель на СИМВОЛ (13)

Хороший вопрос, никогда не делал этого сам :)

Я попал сюда, потому что был обеспокоен тем, что cr-lfs, которые я указал в строках C #, не показывались в ответах на запросы SQl Server Management Studio.

Оказывается, они есть, но не отображаются.

Чтобы "просмотреть" cr-lfs, используйте инструкцию print, например:

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

Вот функция C #, которая добавляет текстовую строку к существующему текстовому двоичному объекту, разделенному CRLFS, и возвращает выражение T-SQL, подходящее для INSERT или UPDATE операции.В нем есть кое-что из нашей фирменной обработки ошибок, но как только вы удалите это, это может оказаться полезным - я надеюсь на это.

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

Я бы сказал

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

или

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

Это всегда здорово, потому что когда вы получаете экспортированные списки, скажем, из Oracle, то получаете записи, занимающие несколько строк, что, в свою очередь, может быть интересно, скажем, для файлов cvs, так что будьте осторожны.

В любом случае, ответ Роба хорош, но я бы посоветовал использовать что-то другое, кроме @, попробовать еще несколько, наприме𠧧@@§§ или что-то в этом роде, чтобы у него был шанс на некоторую уникальность.(Но все же, помните о длине varchar/nvarchar поле, в которое вы вставляете ..)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top