Answers:
实际上,SQL命令或脚本字符串中的新行可以是CR,LF或CR + LF中的任何一行。为了获得全部,您需要这样的东西:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
.columns[0]
代替使用。
REPLACE(@string, CHAR(13) + CHAR(10), '')
我参加聚会可能晚了一年,但是我每天都在处理查询和MS-SQL,并且我对内置函数LTRIM()和RTRIM()感到厌倦(并且总是不得不一起调用它们),并且由于没有捕获到最后有换行符的“脏”数据,因此我认为是时候实现一个更好的TRIM功能了。欢迎同仁反馈!
免责声明:实际上,这消除了(用单个空格代替)空格的扩展形式(制表符,换行,回车等),因此从我的原始答案中将其重命名为“ CleanAndTrim”。这里的想法是,你的字符串并不需要它里面这种额外的特殊空白字符,所以如果在头/尾不发生他们,他们应该用简单的空间所取代。如果您有意将这样的字符存储在字符串中(例如,要在其上运行的数据列),请不要这样做!改进此功能或编写自己的函数,即从字串的端点而不是从“ body”中删除这些字符。
好的,既然免责声明已经更新,下面是代码。
-- =============================================
-- 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
T-SQL中的换行符由CHAR(13)和CHAR(10)(回车+换行符)表示。因此,您可以使用要替换换行符的文本创建一个REPLACE语句。
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
要执行大多数人想要的操作,请创建一个不是实际换行符的占位符。然后,您可以实际结合以下方法:
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字符,效果很好,但是如果要使用占位符(例如
或诸如此类),则第一种方法会更准确一些。
如果您的列数据类型为' text ',则您将收到一条错误消息,提示为
消息8116,级别16,状态1,第2行参数数据类型的文本对于替换功能的参数1无效。
在这种情况下,您需要将文本转换为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报告中的空间,我将其缩减。
上面/之前发布的答案被报告为替换CHAR(13)CHAR(10)回车:
REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')
永远不会到达REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
代码的那一部分,并且将返回以下有害结果:
'something else''something else'
而不是单个结果:
'something else'
这将需要将REPLACE脚本重写为:
REPLACE(REPLACE(REPLACE(MyField, CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(13) + CHAR(10), 'something else')
当流程首先测试第一个/最左边的REPLACE语句时,然后在失败时将继续测试下一个REPLACE语句。