我想替换(或删除)TSQL字符串中的换行符.有任何想法吗?
显而易见的
REPLACE(@string, CHAR(13), '')
Run Code Online (Sandbox Code Playgroud)
只是不会这样做......
RBa*_*ung 807
实际上,SQL命令或脚本字符串中的新行可以是CR,LF或CR + LF中的任何一行.为了得到它们,你需要这样的东西:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
Run Code Online (Sandbox Code Playgroud)
Mit*_*eat 142
REPLACE(@string, CHAR(13) + CHAR(10), '')
Run Code Online (Sandbox Code Playgroud)
Nat*_*teJ 33
我可能迟到了一年,但我每天都在处理查询和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
Run Code Online (Sandbox Code Playgroud)
干杯!
另一个免责声明:典型的Windows换行符是CR + LF,所以如果你的字符串包含那些,你最终会用"双"空格替换它们.
更新,2016年:一个新版本,您可以选择用您选择的其他字符替换这些特殊空格字符!这还包括Windows CR + LF配对的评论和解决方法,即用单个替换替换特定的char-pair.
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
Run Code Online (Sandbox Code Playgroud)
Cer*_*rus 31
T-SQL中的换行符由CHAR(13)和CHAR(10)(回车符+换行符)表示.因此,您可以使用要替换换行符的文本创建REPLACE语句.
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
Run Code Online (Sandbox Code Playgroud)
小智 23
要完成大多数人想要的操作,请创建一个不是实际换行符的占位符.然后你可以实际结合以下方法:
REPLACE(REPLACE(REPLACE(MyField, CHAR(13) + CHAR(10), 'something else'), CHAR(13), 'something else'), CHAR(10), 'something else')
Run Code Online (Sandbox Code Playgroud)
这样您只需更换一次.方法:
REPLACE(REPLACE(MyField, CHAR(13), ''), CHAR(10), '')
Run Code Online (Sandbox Code Playgroud)
如果你只想摆脱CRLF字符,那么效果很好,但是如果你想要一个占位符,比如
等等,那么第一种方法就更准确了.
在 SQL Server 2017 及更高版本中,使用Trim
Select Trim(char(10) + char(13) from @str)
Run Code Online (Sandbox Code Playgroud)
我用它来修剪文件名的特殊字符
Select Trim(char(10) + char(13) + ' *<>' from @fileName)
Run Code Online (Sandbox Code Playgroud)
如果您的列数据类型为" text ",那么您将收到错误消息
消息8116,级别16,状态1,行2参数数据类型文本对替换函数的参数1无效.
在这种情况下,您需要将文本转换为nvarchar然后替换
SELECT REPLACE(REPLACE(cast(@str as nvarchar(max)), CHAR(13), ''), CHAR(10), '')
Run Code Online (Sandbox Code Playgroud)
小智 6
有时
REPLACE(myString, CHAR(13) + CHAR(10), ' ')
Run Code Online (Sandbox Code Playgroud)
行不通的。在这种情况下,请使用以下代码片段:
REPLACE(REPLACE(myString, CHAR(13),''), CHAR(10), ' ')
Run Code Online (Sandbox Code Playgroud)