2010-05-25 7 views
5

Este es un caso extremo de una pregunta, me sorprendería si hay una manera fácil de hacer esto.Los caracteres hexadecimales en varchar() son realmente ascii. Necesito decodificarlo

Tengo una MS SQL DB con un campo de tipo varchar (255). Contiene una cadena hexagonal que en realidad es un Guid cuando lo decodifica usando un decodificador ascii. Sé que suena muy raro, pero aquí es un ejemplo:

Los contenidos del área "38353334373838622D393030302D343732392D383436622D383161336634396339663931"

Lo que realmente representa: "8534788b-9000-4729-846b-81a3f49c9f91"

Necesito una forma de descodificar esto, y simplemente cambie el contenido del campo a la guía real que representa. Necesito hacer esto en T-SQL, no puedo usar .Net (que si pudiera, eso es notablemente simple).

ACTUALIZACIÓN: Algunas personas han respondido con formas que pueden funcionar en declaraciones puntuales, necesito una forma de poner esto en una declaración de actualización.

Por ejemplo: UPDATE SET MiTabla MiCampo = MyFunction (MiCampo)

Dónde MyFunction es la respuesta correcta a esta pregunta.

Respuesta

5

esto le dará lo que want..8534788b-9000-4729-846b-81a3f49c9f91

select CONVERT(varchar(36), 
0x38353334373838622D393030302D343732392D383436622D383161336634396339663931) 

es necesario convertir el valor a VARBINARY y luego convertir de nuevo a varchar

aquí es uno manera que utiliza SQL dinámico

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

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

Eso me lleva la mitad del camino, pero ¿cómo puedo llegar al varbinary? Si lo hago seleccione convertir (varbinary (max), 'FF') me da 0x4646, donde en mi caso la cadena debe ser 0xFF – csauve

+1

es probable que tenga que hacer alguna actualización dinámica declaración SQL – SQLMenace

+0

¡Gracias! Esto definitivamente funcionará, no consideré usar SQL dinámico. :) – csauve

1

Si desea convertir los caracteres individuales que se pueden hacer con la función CHAR como:

SELECT CHAR(0x38) 

Pero debe recordar el prefijo del número con 0x ya que es hexadecimal.

Cuestiones relacionadas