在select中使用时功能不起作用

时间:2015-10-02 14:24:06

标签: sql sql-server database tsql

我正在使用以下函数从字符串中删除所有额外的空格:

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 个答案:

答案 0 :(得分: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 :(得分:0)

您的数据需要清理,它可能有特殊字符? - 合并到您的存储过程中或通过下面的

更新列
LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(YourColumn, CHAR(10), ''), CHAR(13), ''), CHAR(9), '')))

答案 2 :(得分: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