Sql server 在字符串中递归删除空格
我正在尝试从我的表中删除多个空格,该表包含40多列,其中包含字符串值和大约150K行 使用CURSOR,我提出了以下解决方案(作为填充表的存储过程的一部分),但是这不会在一次运行中删除空白。如果我多次手动单独运行update语句,空格将被完全删除。你知道如何在一次运行中清理数据吗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
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代码,请参阅。是否尝试将双空格转换为单空格,或完全删除所有空格?是否尝试将双空格转换为单空格,或完全删除所有空格?