在TSQL中replace换行符
我想replace(或删除)TSQLstring中的换行符。 有任何想法吗?
显而易见的
REPLACE(@string, CHAR(13), '')
只是不会做到这一点…
实际上,SQL命令或脚本string中的新行可以是CR,LF或CR + LF中的任何一行。 为了得到他们,你需要这样的东西:
SELECT REPLACE(REPLACE(@str, CHAR(13), ''), CHAR(10), '')
REPLACE(@string, CHAR(13) + CHAR(10), '')
T-SQL中的换行符由CHAR(13)和CHAR(10)(回车+换行)表示。 因此,您可以使用要replace换行符的文本创buildREPLACE语句。
REPLACE(MyField, CHAR(13) + CHAR(10), 'something else')
我可能晚了一年的晚会,但我每天都在查询和MS-SQL,我厌倦了内置函数LTRIM()和RTRIM()(并且总是不得不一起调用它们),并且没有捕捉到最后换行的“脏”数据,所以我决定现在是时候实施一个更好的TRIMfunction。 我会欢迎同行反馈!
免责声明 :这实际上删除了 (用一个空格replace)扩展forms的空白(制表符,换行,回车等),所以它从我原来的答案重命名为“CleanAndTrim”。 这里的想法是,你的string里面不需要这些额外的特殊空白字符,所以如果它们不在头部/尾部出现,它们应该被一个简单的空格replace。 如果你有意将这些字符存储在你的string中(比如你将要运行的数据列),不要这样做! 改善这个function或者写下你自己的文字,只是从string的端点删除这些字符,而不是从“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,所以如果你的string包含这些,你最终会用“双”空格replace它们。
更新,2016年 :一个新版本,让您select用您select的其他字符replace这些特殊的空白字符! 这也包括评论和Windows CR + LF配对的解决方法,即用一个替代replace特定的字符对。
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
要做大多数人想要的,创build一个不是实际行分隔符的占位符。 那么你可以结合以下方法:
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字符,但如果你想要一个占位符,比如
或者什么的,那么第一种方法是更准确一点。
如果您的列数据types是“ 文本 ”,那么您将收到一条错误消息
消息8116,级别16,状态1,行2参数数据types文本对replace函数的参数1无效。
在这种情况下,您需要将文本转换为nvarchar,然后进行replace
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
这解决了一个问题,我有一个地址过程创build一个固定数量的行字段,即使这些行是空的地址。 为了节省我的SSRS报告中的空间,我把它们减less了。
如果你有使用sp_helptext打开过程,那么只需复制所有文本在新的SQL查询,然后按Ctrl + Hbutton使用正则expression式来replace,并把^ \ nfind字段replace为空白。 为更多细节检查图象。 在这里input图像说明