Sql server 在字符串中递归删除空格

Sql server 在字符串中递归删除空格,sql-server,Sql Server,我正在尝试从我的表中删除多个空格,该表包含40多列,其中包含字符串值和大约150K行 使用CURSOR,我提出了以下解决方案(作为填充表的存储过程的一部分),但是这不会在一次运行中删除空白。如果我多次手动单独运行update语句,空格将被完全删除。你知道如何在一次运行中清理数据吗 Declare @col nvarchar(128) Declare StringCol CUSRSOR for SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUM

我正在尝试从我的表中删除多个空格,该表包含40多列,其中包含字符串值和大约150K行

使用CURSOR,我提出了以下解决方案(作为填充表的存储过程的一部分),但是这不会在一次运行中删除空白。如果我多次手动单独运行update语句,空格将被完全删除。你知道如何在一次运行中清理数据吗

Declare @col nvarchar(128)
Declare StringCol CUSRSOR for
  SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME = 'TableName'
     AND DATA_TYPE = 'varchar'
OPEN StringCol
FETCH NEXT FROM StringCol into @col;
WHILE @@FETCH_STATUS = 0        
   BEGIN
     UPDATE  TableName
     SET     @col = LTRIM(RTRIM(REPLACE(@col, '  ', ' '))) 
     WHERE   @col LIKE '%  %'

    FETCH NEXT FROM StringCol into @col
END

CLOSE StringCol
Deallocate StringCol

END

如果您有SQL Server 2016,您可以在其他版本中使用
STRING\u Split
或类似的UDF函数。诀窍是将单词转换为列,使用非空格并将它们返回到一个值

Declare @col nvarchar(128)
Declare StringCol CUSRSOR for
  SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME = 'TableName'
     AND DATA_TYPE = 'varchar'
OPEN StringCol
FETCH NEXT FROM StringCol into @col;
WHILE @@FETCH_STATUS = 0        
   BEGIN
     UPDATE  TableName
     SET     @col = CONVERT(VARCHAR(MAX), 
               (
                 select Value + ' ' 
                   from STRING_SPLIT (@col, ' ') 
                 where value <>'' for xml path('')
               )
            )
     WHERE   @col LIKE '%  %'

    FETCH NEXT FROM StringCol into @col
END

CLOSE StringCol
Deallocate StringCol

END

如果您有SQL Server 2016,您可以在其他版本中使用
STRING\u Split
或类似的UDF函数。诀窍是将单词转换为列,使用非空格并将它们返回到一个值

Declare @col nvarchar(128)
Declare StringCol CUSRSOR for
  SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME = 'TableName'
     AND DATA_TYPE = 'varchar'
OPEN StringCol
FETCH NEXT FROM StringCol into @col;
WHILE @@FETCH_STATUS = 0        
   BEGIN
     UPDATE  TableName
     SET     @col = CONVERT(VARCHAR(MAX), 
               (
                 select Value + ' ' 
                   from STRING_SPLIT (@col, ' ') 
                 where value <>'' for xml path('')
               )
            )
     WHERE   @col LIKE '%  %'

    FETCH NEXT FROM StringCol into @col
END

CLOSE StringCol
Deallocate StringCol

END
试一试


要使用的演示:

-- code #2
declare @TableName table (col1 varchar(200), col2 varchar(800));

INSERT into @TableName values
   (' aa       aaa    aaaa       a ', 'b   b  ');

SELECT T1.col1, T2.Trimmed as [col1 trimmed], 
       T1.col2, T3.Trimmed as [col2 trimmed]
  from @TableName as T1
       outer apply dbo.AllTrim(T1.col1) as T2
       outer apply dbo.AllTrim(T1.col2) as T3;

要更新的演示:

-- code #3
declare @TableName table (ID int identity, 
                          col1 varchar(200), col2 varchar(800));

INSERT into @TableName (col1, col2) values
   (' aa       aaa    aaaa       a ', 'b   b  '),
   ('xxx       xx   xx   xxxxx', NULL);

with tbTrimmed as (
SELECT T1.ID, 
       T2.Trimmed as [col1 trimmed], 
       T3.Trimmed as [col2 trimmed]
  from @TableName as T1
       outer apply dbo.AllTrim(T1.col1) as T2
       outer apply dbo.AllTrim(T1.col2) as T3
)       
UPDATE TN
  set col1= [col1 trimmed],
      col2= [col2 trimmed]
  from @TableName as TN
       inner join tbTrimmed as Tr on TN.ID = Tr.ID;
试一试


要使用的演示:

-- code #2
declare @TableName table (col1 varchar(200), col2 varchar(800));

INSERT into @TableName values
   (' aa       aaa    aaaa       a ', 'b   b  ');

SELECT T1.col1, T2.Trimmed as [col1 trimmed], 
       T1.col2, T3.Trimmed as [col2 trimmed]
  from @TableName as T1
       outer apply dbo.AllTrim(T1.col1) as T2
       outer apply dbo.AllTrim(T1.col2) as T3;

要更新的演示:

-- code #3
declare @TableName table (ID int identity, 
                          col1 varchar(200), col2 varchar(800));

INSERT into @TableName (col1, col2) values
   (' aa       aaa    aaaa       a ', 'b   b  '),
   ('xxx       xx   xx   xxxxx', NULL);

with tbTrimmed as (
SELECT T1.ID, 
       T2.Trimmed as [col1 trimmed], 
       T3.Trimmed as [col2 trimmed]
  from @TableName as T1
       outer apply dbo.AllTrim(T1.col1) as T2
       outer apply dbo.AllTrim(T1.col2) as T3
)       
UPDATE TN
  set col1= [col1 trimmed],
      col2= [col2 trimmed]
  from @TableName as TN
       inner join tbTrimmed as Tr on TN.ID = Tr.ID;

使用CLR函数,可以使用正则表达式执行此操作:

Declare cnvarchar(max)
Declare @col nvarchar(128)
Declare StringCol CUSRSOR for
  SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME = 'TableName'
     AND DATA_TYPE = 'varchar'
OPEN StringCol
FETCH NEXT FROM StringCol into @col;
WHILE @@FETCH_STATUS = 0        
   BEGIN

    --{ this is the key bit
    set @sql ='
    UPDATE  TableName
    SET     ' + quotename(@col) + ' = dbo.RegexReplace(ltrim(rtrim(' + quotename(@col) + ')), ''\s\s+'', ' '
    WHERE   ' + quotename(@col) + ' LIKE ''%  %'' 
    or      ' + quotename(@col) + ' LIKE '' %'' 
    or      ' + quotename(@col) + ' LIKE ''% '' 

    '
    --} this is the key bit

    --print @sql --for debugging
    exec @sql

    FETCH NEXT FROM StringCol into @col

END

CLOSE StringCol
Deallocate StringCol

END

有关相关CLR代码,请参阅。

使用CLR函数可以使用正则表达式执行此操作:

Declare cnvarchar(max)
Declare @col nvarchar(128)
Declare StringCol CUSRSOR for
  SELECT COLUMN_NAME
  FROM INFORMATION_SCHEMA.COLUMNS 
  WHERE TABLE_NAME = 'TableName'
     AND DATA_TYPE = 'varchar'
OPEN StringCol
FETCH NEXT FROM StringCol into @col;
WHILE @@FETCH_STATUS = 0        
   BEGIN

    --{ this is the key bit
    set @sql ='
    UPDATE  TableName
    SET     ' + quotename(@col) + ' = dbo.RegexReplace(ltrim(rtrim(' + quotename(@col) + ')), ''\s\s+'', ' '
    WHERE   ' + quotename(@col) + ' LIKE ''%  %'' 
    or      ' + quotename(@col) + ' LIKE '' %'' 
    or      ' + quotename(@col) + ' LIKE ''% '' 

    '
    --} this is the key bit

    --print @sql --for debugging
    exec @sql

    FETCH NEXT FROM StringCol into @col

END

CLOSE StringCol
Deallocate StringCol

END

有关CLR代码,请参阅。

是否尝试将双空格转换为单空格,或完全删除所有空格?是否尝试将双空格转换为单空格,或完全删除所有空格?