2015-10-02 116 views
0

使用時不工作我使用下面的函數從字符串中去除所有多餘的空白:功能在選擇

CREATE FUNCTION RemoveSpaces 
(
-- ============================================= 
-- Author:  Amit Singh 
-- Description: Remove extra spaces from string 
-- Usage:  SELECT dbo.RemoveSpaces('Code Jotter') 
-- ============================================= 
    @str AS VARCHAR(MAX) 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    RETURN 
    REPLACE(REPLACE(REPLACE(@str,' ','{}'),'}{',''),'{}',' ') 
END 

功能工作正常。但是當我嘗試使用SELECT語句中的函數時,字符串保持不變。

SELECT TOP 1 
     dbo.RemoveSpaces(sms_message) 
    FROM MyTable 

我收到與sms_message相同的值,但沒有多餘的空格。

+3

你能提供一個'sms_message'的樣本值,你看到這個錯誤的行爲嗎? – Mureinik

+0

@vkp我不認爲修剪功能從「An(space)(space)(space)example」中刪除空格。 – Disasterkid

+4

您看到的消息字符串中的空格不是真實空格。你的代碼應該工作。例如,您的代碼在SQL Fiddle中工作:http://www.sqlfiddle.com/#!3/b0c7c/1。 –

回答

0

你在想這件事。你所需要做的就是用一個空格替換任何雙重空間。解決方法是:

CREATE FUNCTION RemoveSpaces 
(
-- ============================================= 
-- Author:  John Sacharok 
-- Description: Remove extra spaces from string 
-- Usage:  SELECT dbo.RemoveSpaces('Code Jotter') 
-- ============================================= 
    @str AS VARCHAR(MAX) 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    RETURN 
    (REPLACE(@str,' ',' ') 
END 

如果您想要將TAB包含在您要替換的內容中,那麼下面的代碼效果會更好。第二個替換是用於TAB而不是空間。

CREATE FUNCTION RemoveSpaces 
(
-- ============================================= 
-- Author:  John Sacharok 
-- Description: Remove extra spaces and tabs from string 
-- Usage:  SELECT dbo.RemoveSpaces('Code Jotter') 
-- ============================================= 
    @str AS VARCHAR(MAX) 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    RETURN 
    REPLACE(REPLACE(@str,' ',' '),' ',' ') 
END 
+1

似乎OP正試圖刪除的例子,其中有2個或更多的空間順序發生,以保留只有一個空間,以便只保留必要的間距。正如戈登所指出的那樣,更有可能的是,他還有一些其他的空白讓他的功能無法正常工作,因爲它對空間本身來說工作得很好。 –

0

您的數據需要清洗,它可能有特殊字符? - 通過以下

LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(YourColumn, CHAR(10), ''), CHAR(13), ''), CHAR(9), ''))) 
0

根據您提供的例子,它的空間工作的成功的例子,這裏的問題似乎是你的源表納入您的存儲過程或更新該列除此之外其它空白字符只是造成問題的空間。

下面是一些示例代碼,您可以在您的函數中使用它來代替所有空白(從ascii字符維基百科列表開始),並使用不是「{」和「}」的替代標記,而是使用不可打印的ascii字符。

DECLARE @WhiteSpace VARCHAR(500) = 
    CHAR(32) -- Space 
    + CHAR(9) -- Tab 
    + CHAR(10) -- Line feed 
    + CHAR(11) -- Line tab 
    + CHAR(12) -- Form feed 
    + CHAR(13) -- Carriage return 
    + CHAR(133) -- Next line 
DECLARE 
    @i INT = 1, 
    @Delim CHAR(2) = CHAR(17) + CHAR(18), -- Replaces "{}" 
    @DelimRev CHAR(2) = CHAR(18) + CHAR(17) -- Replaces "}{" 
WHILE @i <= LEN(@WhiteSpace) BEGIN 
    SET @str = REPLACE(@str, SUBSTRING(@WhiteSpace, @i, 1), @Delim) 
    SET @i = @i + 1 
END 
SET @str = REPLACE(REPLACE(@str, @DelimRev, ''),@Delim, ' ') -- With just space 
+0

@PedRam如果它幫助你,並且在解決你的問題時接受它,請隨時註冊一個答案。這有助於他人知道哪些答案可能對您的問題有所幫助。它也增加了你的聲譽。 –