在SQL Server 2008中删除字符串中的所有空格的最佳方法是什么?

LTRIM(RTRIM(' a b '))将删除字符串右侧和左侧的所有空格,但我还需要删除中间的空格。


当前回答

我分享一个解决方案,在我看来,它非常快,但安装起来有点繁琐。它在Microsoft SQL Server 2008 R2 (SP3)上工作得很好:

在数据库所在的服务器上安装Sql Regex程序集。安装步骤如下: https://github.com/DevNambi/sql-server-regex#installation 在数据库中创建函数dbo。TRIM,它基于RegexReplace()标量函数(https://github.com/DevNambi/sql-server-regex#replace):

CREATE FUNCTION [dbo].[TRIM](@text NVARCHAR(MAX))
  RETURNS NVARCHAR(MAX) --WITH SCHEMABINDING 
BEGIN

-- This function removes:
-- 1. invisible characters,
-- 2. repeated blank spaces and
-- 3. the spaces at the beginning and at the end of the text.

    RETURN (CASE
        WHEN @text is NULL 
            THEN NULL
        ELSE

            dbo.RegexReplace((dbo.RegexReplace(dbo.RegexReplace(@text, N'['+Nchar(0)+N'-'+Nchar(32)+Nchar(8192)+N'-'+Nchar(8202)+Nchar(160)+Nchar(5760)+Nchar(6158)+Nchar(8232)+Nchar(8233)+Nchar(8239)+Nchar(8287)+Nchar(65440)+Nchar(12288) +N']+', N'[}'), N'[\[\}]+', ' ')), N'^\s+|\s+$','')  

    END);
END
GO

....................

使用方法:

declare @txt NVARCHAR(MAX) = N' Hello,'+Nchar(12288)+N'          my      '+NCHAR(160)+N'name'+Nchar(0)+N'     is John'+NCHAR(11)+N'            Doe';

select dbo.TRIM(@txt) as Result -- Result: "Hello, my name is John Doe"

....................

更新:

要完全删除所有空格,您可以创建以下函数:

CREATE FUNCTION [dbo].[TRIM_SPACES](@text NVARCHAR(MAX))
  RETURNS NVARCHAR(MAX) --WITH SCHEMABINDING 
BEGIN
    RETURN (CASE WHEN @text is NULL THEN NULL ELSE
            dbo.RegexReplace(@text, N'['+Nchar(0)+N'-'+Nchar(32)+Nchar(8192)+N'-'+Nchar(8202)+Nchar(160)+Nchar(5760)+Nchar(6158)+Nchar(8232)+Nchar(8233)+Nchar(8239)+Nchar(8287)+Nchar(65440)+Nchar(12288) +N']+', N'')
    END)
END
GO

....................

使用方法:

declare @txt NVARCHAR(MAX) = N' Hello,'+Nchar(12288)+N'          my      '+NCHAR(160)+N'name'+Nchar(0)+N'     is John'+NCHAR(11)+N'            Doe';

select dbo.TRIM_SPACES(@txt) as Result -- Result: "Hello,mynameisJohnDoe"

其他回答

由于某种原因,replace每次只对一个字符串起作用。 我有一个像这样的字符串“Test MSP”,我想只留下一个空格。

我使用了@Farhan的方法,但做了一些修改:

CREATE FUNCTION ReplaceAll
(
    @OriginalString varchar(8000),
    @StringToRemove varchar(20),
    @StringToPutInPlace varchar(20)
)
RETURNS varchar(8000)
AS
BEGIN
declare @ResultStr varchar(8000)
set @ResultStr = @OriginalString
while charindex(@StringToRemove, @ResultStr) > 0
    set @ResultStr = replace(@ResultStr, @StringToRemove, @StringToPutInPlace)

return @ResultStr
END

然后像这样运行更新

UPDATE tbTest SET Description = dbo.ReplaceAll(Description, '  ', ' ') WHERE ID = 14225

然后我得到了这个结果: 测试MSP

张贴在这里,如果有人需要它,就像我一样。

上运行: Microsoft SQL Server 2016 (SP2)

T-sql replace http://msdn.microsoft.com/en-us/library/ms186862.aspx

代表(val, ', ', ')

如果正规空格没有被LTRM或RTRM删除,请尝试这样使用

LTRIM(RTRIM(REPLACE(REPLACE(REPLACE(Column_data, CHAR(9), ''), CHAR(10), ''), CHAR(13), '')))
replace(replace(column_Name,CHAR(13),''),CHAR(10),'')

我会使用REPLACE

select REPLACE (' Hello , How Are You ?', ' ', '' )

取代