2010-05-25 18 views
5

Ceci est un tel cas d'une question, je serais surpris s'il y a un moyen facile de le faire.Les caractères hexadécimaux dans varchar() sont en réalité des ascii. Besoin de le décoder

J'ai un MS SQL DB avec un champ de type varchar (255). Il contient une chaîne hexadécimale qui est en fait un Guid lorsque vous le décodez en utilisant un décodeur ASCII. Je sais que cela semble vraiment bizarre, mais voici un exemple:

Le contenu du champ: « 38353334373838622D393030302D343732392D383436622D383161336634396339663931 »

Qu'est-ce qu'il représente en fait: « 8534788b-9000-4729-846b-81a3f49c9f91 »

J'ai besoin un moyen de décoder cela, et juste changer le contenu du champ pour le guid réel qu'il représente. Je dois le faire en T-SQL, je ne peux pas utiliser .Net (ce qui si je peux, c'est remarquablement simple).

MISE À JOUR: Certaines personnes ont répondu avec des façons qui peuvent fonctionner dans des instructions uniques, j'ai besoin d'un moyen de mettre cela dans une instruction UPDATE.

Par exemple: UPDATE MyTable SET MyField = MyFunction (MyField)

Où MyFunction est la bonne réponse à cette question.

Répondre

5

cela vous donnera ce que vous want..8534788b-9000-4729-846b-81a3f49c9f91

select CONVERT(varchar(36), 
0x38353334373838622D393030302D343732392D383436622D383161336634396339663931) 

vous devez convertir la valeur en VarBinary puis reconvertir varchar

est un ici manière avec SQL dynamique

declare @v varchar(100) 
select @v = '0x' + '38353334373838622D393030302D343732392D383436622D383161336634396339663931' 

exec ('SELECT CONVERT(varchar(36),' + @v + ')') 
+0

Cela me permet de faire la moitié du chemin, mais comment arriver au varbinary? Si je fais sélectionnez convertir (varbinary (max), 'FF') il me donne 0x4646, où dans mon cas la chaîne devrait être 0xFF – csauve

+1

vous avez probablement besoin de faire une mise à jour dynamique SQL instruction – SQLMenace

+0

Merci! Cela fonctionnera certainement, je n'ai pas envisagé d'utiliser le SQL dynamique. :) – csauve

1

Si vous voulez convertir les caractères individuels, vous pouvez le faire avec la fonction CHAR comme:

SELECT CHAR(0x38) 

Mais vous devez vous rappeler de préfixer le nombre avec 0x car il est hexadécimal.