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)
试试这个,它比循环更好,因为只有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)