我驚呆了,這個問題還沒有被有意義地問過。如何在SQL中創建一個等效函數,如LTRIM
或RTRIM
,用於僅在字符串的開始或結尾處進行回車和換行。SQL只刪除前導或尾隨回車
顯然REPLACE(REPLACE(@MyString,char(10),''),char(13),'')
刪除所有回車和新的換行。這不是我正在尋找的。我只想刪除前面或後面的。
我驚呆了,這個問題還沒有被有意義地問過。如何在SQL中創建一個等效函數,如LTRIM
或RTRIM
,用於僅在字符串的開始或結尾處進行回車和換行。SQL只刪除前導或尾隨回車
顯然REPLACE(REPLACE(@MyString,char(10),''),char(13),'')
刪除所有回車和新的換行。這不是我正在尋找的。我只想刪除前面或後面的。
找到的第一個字符是而不是CHAR(13)
或CHAR(10)
並從字符串長度中減去它的位置。
LTRIM()
SELECT RIGHT(@MyString,LEN(@MyString)-PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@MyString)+1)
RTRIM()
SELECT LEFT(@MyString,LEN(@MyString)-PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',REVERSE(@MyString))+1)
以下功能增強型的trim
功能就可以使用。從sqlauthority.com
這些功能複製刪除尾隨空格,前導空格,空格,製表符,回車符,換行符等
修剪左
CREATE FUNCTION dbo.LTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @trimchars VARCHAR(10)
SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
IF @str LIKE '[' + @trimchars + ']%' SET @str = SUBSTRING(@str, PATINDEX('%[^' + @trimchars + ']%', @str), 8000)
RETURN @str
END
修剪右
CREATE FUNCTION dbo.RTrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @trimchars VARCHAR(10)
SET @trimchars = CHAR(9)+CHAR(10)+CHAR(13)+CHAR(32)
IF @str LIKE '%[' + @trimchars + ']'
SET @str = REVERSE(dbo.LTrimX(REVERSE(@str)))
RETURN @str
END
修剪左和右
CREATE FUNCTION dbo.TrimX(@str VARCHAR(MAX)) RETURNS VARCHAR(MAX)
AS
BEGIN
RETURN dbo.LTrimX(dbo.RTrimX(@str))
END
使用功能
SELECT dbo.TRIMX(@MyString)
我決定把這結果作爲Xml
值,讓你的時候點擊它,你將能夠查看回車。
DECLARE @CRLF Char(2) = (CHAR(0x0D) + CHAR(0x0A))
DECLARE @String VarChar(MAX) = @CRLF + @CRLF + ' Hello' + @CRLF + 'World ' + @CRLF + @CRLF
--Unmodified String:
SELECT CAST(@String as Xml)[Unmodified]
--Remove Trailing Whitespace (including Spaces).
SELECT CAST(LEFT(@String, LEN(REPLACE(@String, @CRLF, ' '))) as Xml)[RemoveTrailingWhitespace]
--Remove Leading Whitespace (including Spaces).
SELECT CAST(RIGHT(@String, LEN(REVERSE(REPLACE(@String, @CRLF, ' ')))) as Xml)[RemoveLeadingWhitespace]
--Remove Leading & Trailing Whitespace (including Spaces).
SELECT CAST(SUBSTRING(@String, LEN(REPLACE(@String, ' ', '_')) - LEN(REVERSE(REPLACE(@String, @CRLF, ' '))) + 1, LEN(LTRIM(RTRIM(REPLACE(@String, @CRLF, ' '))))) as Xml)[RemoveAllWhitespace]
--Remove Only Leading and Trailing CR/LF's (while still preserving all other Whitespace - including Spaces). - 04/06/2016 - MCR.
SELECT CAST(SUBSTRING(@String, PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@String), LEN(REPLACE(@String, ' ', '_')) - PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%',@String) + 1 - PATINDEX('%[^'+CHAR(13)+CHAR(10)+']%', REVERSE(@String)) + 1) as Xml)[RemoveLeadingAndTrailingCRLFsOnly]
記得刪除Cast-to-Xml,因爲這只是作爲一個概念驗證來顯示它的工作。
乍一看,這似乎使用比接受答案更多的函數。
但是,情況並非如此。
如果你把在接受的答案列出兩種方法(除去都拖尾和先行空白),你將不得不作出兩遍更新記錄,或副本都是一個邏輯到其他(到處@String
被列出),這將導致更多的函數調用,並且變得更難以閱讀。
這很好,但如果該字符串只包含CRLF字符,則會失敗。在這種情況下PATINDEX返回0,所以返回整個字符串。 – Dave