2016-11-06 18 views
1

テーブル内に複数の空白を削除しようとしています。文字列内のスペースを再帰的に削除します

CURSORを使用して、私はテーブルにデータを格納するストアドプロシージャの一部として以下の解決策を考え出しましたが、これは1回の実行で空白を削除しません。更新ステートメントだけを手動で複数回実行すると、スペースが完全に削除されます。どのように私は一回でデータをクリーンアップすることができますか?

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 
+0

ダブルスペースをシングルスペースに変換しようとしているのですか、またはすべてのスペースを完全に削除しようとしていますか? –

答えて

0

SQL Server 2016をお持ちの場合、STRING_Splitまたは他のバージョンの同様のUDF関数を使用できます。トリックは、列に単語を変換する非スペースを取り、1つの値に戻ってそれらをもたらすで

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は、このUDF STRING_SPLIT機能を使用する場合:

CREATE FUNCTION [dbo].[STRING_SPLIT] 
(
    @String nvarchar(max),  -- String to be parsed 
    @Delm nchar(1)=',' 
) 
returns @Table TABLE (/*ID int identity(1,1), */ value nvarchar(max)) 
Begin 
    INSERT @Table(value) 
    SELECT ltrim(t.val.value('.', 'VARCHAR(100)')) AS value 
    FROM(
      SELECT Convert(XML, '<M>' + REPLACE(@String, @Delm, '</M><M>') + '</M>') AS x 
     ) AS A CROSS APPLY x.nodes ('/M') AS t(val) 
    Return 
End 
0
を使用する

てみ

-- code #1 
CREATE FUNCTION [dbo].[AllTrim] (@Texto varchar(8000)) 
returns table as 
return 
with xTrim as (
SELECT Rep= 1, 
     Trimmed= Replace(Ltrim(Rtrim(@Texto)), space(2), space(1)) 

union all 

SELECT Charindex(space(2), Trimmed), 
     Replace(Trimmed, space(2), space(1)) 
    from xTrim 
    where Rep > 0 
) 
SELECT Trimmed 
    from xTrim 
    where Rep = 0; 
go 

デモ:

012更新する
-- 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; 

デモ:あなたは正規表現を使用してこれを行うことができますCLR機能を使用して

-- 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; 
0

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コードのhttps://msdn.microsoft.com/en-us/library/ff878119.aspxを参照してください。

関連する問題