2017-08-17 6 views
2

はここは、SQL Serverの文字列に六角を変換する方法

0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e 

期待出力された私の六角入力されている:

<<[IMG][SIZE]HALF[/SIZE][ID]54[/ID][/IMG]>> 
+0

https://dba.stackexchange.com/questions/132996/convert-hexadecimal-to-varchar –

+0

SELECT CONVERT(VARCHAR(MAX)、0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e)。 –

+0

このリンクは私に役立ちます。 << [IMG] [SIZE]ハーフ[/ SIZE] [ID] 54 [/ ID] [/ IMG] >>この結果を取得する必要があります。 –

答えて

1

を反復処理するために再帰を使用します:

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]>> 

複数の文字がある場合、またはハードコーディングが発生している場合は、
そして、また、その結果を取得します交換をループ:あなたはUDFでラップたい場合

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; 

そしてあなたも、クエリでそれを使用することができます。

+0

これは私が探しているものです、本当にあなたの助けに感謝! –

+0

@NileshBankarありがとう。私は、ハードコードされていないバージョンを置き換えて、より多くのコードを置き換えることができるようにしました。 – LukStorms

2

あなたの文字列で、あなたはそれを解析する必要があるので、六角や文字データをミキシングコードでトリッキーな部分は、0xCC部分文字列をそれが表す文字に変換することです。まず、バイナリのふりをして、charにキャストします。すべて0xCCのサブストリング

declare @imp nvarchar(max) = '0x3c0x3c0x5bIMG0x5d0x5bSIZE0x5dHALF0x5b0x2fSIZE0x5d0x5bID0x5d540x5b0x2fID0x5d0x5b0x2fIMG0x5d0x3e0x3e'; 

with cte as (
select replace(col, val, cast(convert(binary(2), val, 1) as char(1))) as col 
from (
    -- sample table 
    select @imp as col 
    ) tbl 
cross apply (select patindex('%0x__%',tbl.col) pos) p 
cross apply (select substring(col,pos,4) val) v 
union all 
select replace(col, val, cast(convert(binary(2), val, 1) as char(1))) as col 
from cte 
cross apply (select patindex('%0x__%',col) pos) p 
cross apply (select substring(col,pos,4) val) v 
where pos > 0 
) 
select * 
from cte 
where patindex('%0x__%',col) = 0; 

返し

それは常に、あなたはまた、このようにそれらを置き換えることができ、変数に交換が必要ASCIIコードの小さなセットのみのためなら
col 
<<[IMG][SIZE]HALF[/SIZE][ID]54[/ID][/IMG]>> 
+0

助けてくれてありがとう!! –

関連する問題