如果它只是用于始终需要在变量中替换的一小部分 ascii 代码,那么您也可以像这样替换它们:
declare @string varchar(max) = '0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e';
select @string = replace(@string,hex,chr)
from (values
('0x3c','<'),
('0x3e','>'),
('0x5b','['),
('0x5d',']'),
('0x2f','/')
) hexes(hex,chr);
select @string as string;
返回:
string
------
<<[IMG][SIZE]HALF[/SIZE][ID]54[/ID][/IMG]>>
如果有更多字符,或者硬编码不受欢迎?
然后循环替换也会得到这个结果:
declare @string varchar(max) = '0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e';
declare @loopcount int = 0;
declare @hex char(4);
while (patindex('%0x[0-9][a-f0-9]%',@string)>0
and @loopcount < 128) -- just safety measure to avoid infinit loop
begin
set @hex = substring(@string,patindex('%0x[0-9][a-f0-9]%',@string),4);
set @string = replace(@string, @hex, convert(char(1),convert(binary(2), @hex, 1)));
set @loopcount = @loopcount + 1;
end;
select @string as string;
如果您将它包装在 UDF 中,那么您甚至可以在查询中使用它。