Заменить новую строку в TSQL

Я хотел бы заменить (или удалить) символ новой строки в TSQL-строке. Любые идеи?

Очевидный

REPLACE(@string, CHAR(13), '')

просто не будет этого делать...

Ответ 1

На самом деле новая строка в команде SQL или строка script может быть любой из CR, LF или CR + LF. Чтобы получить их все, вам нужно что-то вроде этого:

SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')

Ответ 2

REPLACE(@string, CHAR(13) + CHAR(10), '')

Ответ 3

Новая строка в T-SQL представлена ​​ CHAR (13) и CHAR (10) (возврат каретки + подача строки). Соответственно, вы можете создать оператор REPLACE с текстом, который вы хотите заменить новой строкой.

REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')

Ответ 4

Я могу опоздать на вечеринку на год, но каждый день я работаю над запросами и MS-SQL, и я устал от встроенных функций LTRIM() и RTRIM() (и всегда их нужно называть), а также не ловить "грязные" данные, у которых были новые строки в конце, поэтому я решил, что настало время реализовать лучшую функцию TRIM. Я бы приветствовал обратную связь со сверстниками!

Отказ от ответственности: на самом деле удаляет (заменяет одним пробелом) расширенные формы пробелов (вкладка, строка, возврат каретки и т.д.), поэтому она была переименована как "CleanAndTrim" из мой оригинальный ответ. Идея здесь в том, что ваша строка не нуждается в таких дополнительных символах специального пробела внутри нее, и поэтому, если они не встречаются в голове/хвосте, они должны быть заменены простым пространством. Если вы целенаправленно храните такие символы в своей строке (например, ваш столбец данных, который вы собираетесь запустить), НЕ ДЕЛАЙТЕ ЭТО! Улучшите эту функцию или напишите свой собственный, который буквально просто удаляет эти символы из конечных точек строки, а не из тела.

Хорошо, теперь, когда оговорка обновлена, вот код.

-- =============================================
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char 9-13, which are tab, line-feed, vert tab,
-- form-feed, & carriage-return (respectively), with a whitespace
-- (and then trims that off if it still at the beginning or end, of course).
-- =============================================
CREATE FUNCTION [fn_CleanAndTrim] (
       @Str nvarchar(max)
)
RETURNS nvarchar(max) AS
BEGIN
       DECLARE @Result nvarchar(max)

       SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
              LTRIM(RTRIM(@Str)), CHAR(9), ' '), CHAR(10), ' '), CHAR(11), ' '), CHAR(12), ' '), CHAR(13), ' ')))

       RETURN @Result
END

Ура!

Другой отказ от ответственности: Ваш типичный разрыв строки Windows - CR + LF, поэтому, если ваша строка содержит их, вы в конечном итоге замените их "двойными" пробелами.

ОБНОВЛЕНИЕ, 2016: Новая версия, которая дает вам возможность заменить эти символы специального пробела символами других по вашему выбору! Это также включает комментарий и обход для соединения Windows CR + LF, т.е. Заменяет этот конкретный char -пар с помощью одной подстановки.

IF OBJECT_ID('dbo.fn_CleanAndTrim') IS NULL
    EXEC ('CREATE FUNCTION dbo.fn_CleanAndTrim () RETURNS INT AS BEGIN RETURN 0 END')
GO
-- =============================================
-- Author: Nate Johnson
-- Source: http://stackoverflow.com/posts/24068265
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char 9-13, which are tab, line-feed, vert tab, form-feed,
-- & carriage-return (respectively), with a whitespace or specified character(s).
-- Option "@PurgeReplaceCharsAtEnds" determines whether or not to remove extra head/tail
-- replacement-chars from the string after doing the initial replacements.
-- This is only truly useful if you're replacing the special-chars with something
-- **OTHER** than a space, because plain LTRIM/RTRIM will have already removed those.
-- =============================================
ALTER FUNCTION dbo.[fn_CleanAndTrim] (
    @Str NVARCHAR(MAX)
    , @ReplaceTabWith NVARCHAR(5) = ' '
    , @ReplaceNewlineWith NVARCHAR(5) = ' '
    , @PurgeReplaceCharsAtEnds BIT = 1
)
RETURNS NVARCHAR(MAX) AS
BEGIN
    DECLARE @Result NVARCHAR(MAX)

    --The main work (trim & initial replacements)
    SET @Result = LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(
        LTRIM(RTRIM(@Str))  --Basic trim
        , NCHAR(9), @ReplaceTabWith), NCHAR(11), @ReplaceTabWith)   --Replace tab & vertical-tab
        , (NCHAR(13) + NCHAR(10)), @ReplaceNewlineWith) --Replace "Windows" linebreak (CR+LF)
        , NCHAR(10), @ReplaceNewlineWith), NCHAR(12), @ReplaceNewlineWith), NCHAR(13), @ReplaceNewlineWith)))   --Replace other newlines

    --If asked to trim replacement-char from the ends & they're not both whitespaces
    IF (@PurgeReplaceCharsAtEnds = 1 AND NOT (@ReplaceTabWith = N' ' AND @ReplaceNewlineWith = N' '))
    BEGIN
        --Purge from head of string (beginning)
        WHILE (LEFT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceTabWith)/2 + 1, DATALENGTH(@Result)/2)

        WHILE (LEFT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, DATALENGTH(@ReplaceNewlineWith)/2 + 1, DATALENGTH(@Result)/2)

        --Purge from tail of string (end)
        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceTabWith)/2) = @ReplaceTabWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceTabWith)/2)

        WHILE (RIGHT(@Result, DATALENGTH(@ReplaceNewlineWith)/2) = @ReplaceNewlineWith)
            SET @Result = SUBSTRING(@Result, 1, DATALENGTH(@Result)/2 - DATALENGTH(@ReplaceNewlineWith)/2)
    END

    RETURN @Result
END
GO

Ответ 5

Чтобы сделать то, что захотите большинством людей, создайте местозаполнитель, который не является фактическим символом нарушения строки. Затем вы можете комбинировать подходы для:

REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')

Таким образом, вы заменяете только один раз. Подход:

REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')

Отлично работает, если вы просто хотите избавиться от символов CRLF, но если вы хотите заполнить его, например,
или что-то еще, то первый подход будет немного более точным.

Ответ 6

Если тип данных столбца " текст", вы получите сообщение об ошибке как

Msg 8116, уровень 16, состояние 1, строка 2 Тип данных типа аргумента недействителен для аргумента 1 функции replace.

В этом случае вам нужно отбросить текст как nvarchar, а затем заменить

SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')

Ответ 7

Если у вас есть проблема, когда вы хотите удалить только конечные символы, вы можете попробовать следующее:

WHILE EXISTS
(SELECT * FROM @ReportSet WHERE
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32)
BEGIN
    UPDATE @ReportSet
    SET addr_3 = LEFT(addr_3,LEN(addr_3)-1)
    WHERE 
    ASCII(right(addr_3,1)) = 10
    OR ASCII(right(addr_3,1)) = 13
    OR ASCII(right(addr_3,1)) = 32
END

Это решило проблему с адресами, где процедура создала поле с фиксированным числом строк, даже если эти строки были пустыми. Чтобы сэкономить место в отчете SSRS, я сократил их.

Ответ 8

Если у вас есть открытая процедура с использованием sp_helptext, тогда просто скопируйте весь текст в новый sql-запрос и нажмите ctrl + h, чтобы использовать регулярное выражение для замены и помещать ^\n в поле поиска заменить пробелом. для более подробной проверки изображения. введите описание изображения здесь

Ответ 9

Для решения @Cerebrus: для H2 для строк "+" не поддерживается. Так:

REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')