SQL - 替换字符串中的所有"ASCII /特殊字符"

Bre*_*tKB 1 sql t-sql replace cursor special-characters

编辑:我有大约80个字符导致我的应用程序出现问题,因此我不想为每个字符硬编码REPLACE.我认为用两列"特殊字符"和"替换字符"创建一个单独的表会更容易,我将从包含"StringTest"列的原始表中删除这些列.我的目标是找出如何使用字符表替换字符串表中的字符.

我试图用SQL Server中的"MappedCharacters"(A,AE,C)替换所有"特殊字符"(即À,Æ,Ç).我尝试了两种不同的技术,一种使用光标,一种没有光标,搜索字符串并用映射的字符替换所有特殊字符.我的每个方法只替换它们与字符串在同一行中的字符.以前的例子:

num   SpecialCharacter    MappedCharacter    StringTest
 1           À                   A             StringÀÆ
 2           Æ                   AE            ÆStringÆ
 3           Ç                   C             StrÇÀing
Run Code Online (Sandbox Code Playgroud)

示例之后:

num   SpecialCharacter    MappedCharacter    StringTest
 1           À                   A             StringAÆ
 2           Æ                   AE            AEStringAE
 3           Ç                   C             StrCÀing
Run Code Online (Sandbox Code Playgroud)

首选输出:

num   SpecialCharacter    MappedCharacter    StringTest
 1           À                   A             StringAAE
 2           Æ                   AE            AEStringAE
 3           Ç                   C             StrCAing
Run Code Online (Sandbox Code Playgroud)

因此,您可以看到我想要替换StringTest中的所有"特殊字符",但只有同一行中的字符才会被替换.

我还没有想出如何做到这一点.

这是我一直在尝试修改的两个SQL代码(我只需要一个工作)

第一种方法:

              DECLARE @cASCIINum INT;
              DECLARE @cSpecialChar VARCHAR(50);
              DECLARE @cMappedChar VARCHAR(50);
              DECLARE @cStringTest VARCHAR(50);

              DECLARE @mapCursor as CURSOR;

              SET @mapCursor = CURSOR FOR
              SELECT [ASCIINum]
                    ,[SpecialChar]
                    ,[MappedChar]
                    ,[StringTest]
              FROM [intranet].[dbo].[CharMapTestTab]; 

              OPEN @mapCursor;
              FETCH NEXT FROM @mapCursor INTO @cASCIINum,
                                              @cSpecialChar,
                                              @cMappedChar,
                                              @cStringTest;

                WHILE @@FETCH_STATUS = 0
                BEGIN

                  UPDATE [intranet].[dbo].[CharMapTestTab]
                  SET StringTest = REPLACE(StringTest, SpecialChar, MappedChar)
                  WHERE SpecialChar <> MappedChar

                END

                CLOSE @mapCursor;
                DEALLOCATE @mapCursor;
Run Code Online (Sandbox Code Playgroud)

第二种方法:

            DECLARE @ASCIINum INT = 0

            WHILE (1 = 1) 
            BEGIN  

              SELECT @ASCIINum = ASCIINum
              FROM [intranet].[dbo].[CharMapTestTab]
              WHERE ASCIINum > @ASCIINum 
              ORDER BY ASCIINum

              IF @@ROWCOUNT = 0 BREAK;

                  UPDATE [intranet].[dbo].[CharMapTestTab]
                  SET StringTest = REPLACE(StringTest, SpecialChar, MappedChar)
                  WHERE SpecialChar <> MappedChar


              SELECT TOP 1000 [ASCIINum]
                  ,[SpecialChar]
                  ,[MappedChar]
                  ,[StringTest]
              FROM [intranet].[dbo].[CharMapTestTab]



            END
Run Code Online (Sandbox Code Playgroud)

t-c*_*.dk 5

试试这个,它比循环更好,因为只有1个更新:

-- create test table vc
create table vc(StringTest varchar(20))
insert vc values('StringÀÆ'), ('ÆStringÆ')
go

-- create test table CharacterMapping
create table CharacterMapping(SpecialCharacter char(1), MappedCharacter varchar(2))
insert CharacterMapping values('À', 'A'),('Æ', 'AE'), ('Ç', 'C')
go

--build the varchar for updating
declare @x varchar(max) = 'StringTest'
select @x = 'replace('+@x+', ''' + SpecialCharacter + ''','''+MappedCharacter+''')'  
from CharacterMapping
set @x = 'update vc set StringTest=' + @x +' from vc'

exec (@x)

select * from vc
Run Code Online (Sandbox Code Playgroud)

结果:

StringAAE
AEStringAE
Run Code Online (Sandbox Code Playgroud)