Шестнадцатеричные символы в varchar () на самом деле ascii. Нужно расшифровать - PullRequest
5 голосов
/ 25 мая 2010

Это такой крайний случай вопроса, я был бы удивлен, если есть простой способ сделать это.

У меня есть БД MS SQL с полем типа varchar (255). Он содержит шестнадцатеричную строку, которая на самом деле является Guid, когда вы декодируете ее с помощью декодера ascii. Я знаю, это звучит очень странно, но вот пример:

Содержимое поля: "38353334373838622D393030302D343732392D383436622D383161336634396339663931"

Что это на самом деле представляет: "8534788b-9000-4729-846b-81a3f49c9f91"

Мне нужен способ, чтобы расшифровать это, и просто изменить содержимое поля на фактический guid, который он представляет. Мне нужно сделать это в T-SQL, я не могу использовать .Net (что, если бы я мог, это удивительно просто).

ОБНОВЛЕНИЕ : Некоторые люди ответили способами, которые могут работать в одноразовых утверждениях, мне нужен способ поместить это в утверждение UPDATE.

Например: ОБНОВЛЕНИЕ MyTable SET MyField = MyFunction (MyField)

Где MyFunction - правильный ответ на этот вопрос.

Ответы [ 2 ]

6 голосов
/ 25 мая 2010

это даст вам то, что вы хотите.

select CONVERT(varchar(36),
0x38353334373838622D393030302D343732392D383436622D383161336634396339663931)

вам нужно преобразовать значение в varbinary, а затем преобразовать обратно в varchar

вот один из способов использования динамического SQL

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

exec ( 'SELECT CONVERT(varchar(36),' + @v + ')')
1 голос
/ 25 мая 2010

Если вы хотите преобразовать отдельные символы, вы можете сделать это с помощью функции CHAR как:

SELECT CHAR(0x38)

Но вы должны помнить, что перед числом должно стоять 0x, поскольку оно шестнадцатеричное.

...