Заменить новую строку в TSQL
Я хотел бы заменить (или удалить) символ новой строки в TSQL не строки. Есть Идеи?
очевидно
REPLACE(@string, CHAR(13), '')
просто не будет этого делать...
9 ответов
фактически новая строка в строке команды SQL или скрипта может быть любой из CR, LF или CR+LF. Чтобы получить их все, нужно что-то вроде этого:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
новая строка в T-SQL представлена CHAR (13) & CHAR(10) (возврат каретки + подача строки). Соответственно, можно создать оператор REPLACE с текстом, который требуется заменить новой строкой.
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
Я могу опоздать на год на вечеринку, но я работаю над запросами & MS-SQL каждый день, и я устал от встроенных функций LTRIM() & RTRIM() (и всегда должен вызывать их вместе), и не ловить "грязные" данные, у которых были новые строки в конце, поэтому я решил, что пришло время реализовать лучшую функцию обрезки. Я приветствую коллег!
отказ от ответственности: это на самом деле выводит (заменяет одним пробелом) расширенные формы пробелов (табуляции, перевода строки, возврата каретки и т. д.), поэтому он был переименован в" CleanAndTrim " из моего первоначального ответа. Идея здесь в том, что ваша строка не нужно такие дополнительные специальные пробелы внутри него, и поэтому, если они не встречаются в голове / хвосте, их следует заменить простым пробелом. Если вы намеренно сохранили такие символы в своей строке (скажем, в столбце данных, на котором вы собираетесь запустить это), не делайте этого! Улучшите эту функцию или напишите свою, что буквально просто удаляет эти символы из конечных точек строки, а не из "тела".
хорошо, теперь, когда отказ от ответственности обновляется, вот код.
-- =============================================
-- Description: TRIMs a string 'for real' - removes standard whitespace from ends,
-- and replaces ASCII-char's 9-13, which are tab, line-feed, vert tab,
-- form-feed, & carriage-return (respectively), with a whitespace
-- (and then trims that off if it's 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, т. е. заменяет эту конкретную пару символов одной заменой.
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's 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's 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
чтобы сделать то, что большинство людей хотели бы, создайте заполнитель, который не является фактическим символом разрыва строки. Тогда вы можете фактически объединить подходы для:
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, но если вы хотите заполнитель, например
или что-то еще, тогда первый подход немного более точен.
Если ваш тип данных столбца "текст - тогда вы получите сообщение об ошибке, как
Msg 8116, Уровень 16, состояние 1, строка 2 Тип данных аргумента текст недопустимый для аргумента 1 функции replace.
в этом случае вам нужно бросить текст как nvarchar, а затем заменить
SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')
Если у вас есть вопрос, где вы хотите удалить трейлинг символы, вы можете попробовать это:
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, я сократил их.
Если у вас есть открытая процедура с использованием sp_helptext, просто скопируйте весь текст в новый sql-запрос и нажмите ctrl+h, используйте регулярное выражение для замены и поместите ^\n в поле найти заменить пустым . для более подробной проверки изображения. Введите описание изображения здесь
to @Cerebrus решение: для H2 для строк " + " не suuported. Итак:
REPLACE(string, CHAR(13) || CHAR(10), 'replacementString')