2015-10-02 118 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如果它帮助你,并且在解决你的问题时接受它,请随时注册一个答案。这有助于他人知道哪些答案可能对您的问题有所帮助。它也增加了你的声誉。 –