在 varchar() 中的十六进制字符实际上是 ASCII 码,需要进行解码。

5
这是一道有点特殊的问题,如果有简单的方法来解决,我会感到惊讶。
我有一个MS SQL数据库,其中包含一个类型为varchar(255)的字段。它包含一个十六进制字符串,实际上是一个Guid,当您使用ascii解码器对其进行解码时。我知道这听起来非常奇怪,但以下是一个示例:
字段的内容:“38353334373838622D393030302D343732392D383436622D383161336634396339663931”
它实际上表示的是:“8534788b-9000-4729-846b-81a3f49c9f91”
我需要一种方法来解码它,并将字段的内容更改为它所代表的实际guid。我需要在T-SQL中执行此操作,不能使用.Net(如果可以,那就非常简单了)。
更新:一些人已经回答了可能适用于一次性语句的方法,但我需要一种将其放入UPDATE语句中的方法。
例如:UPDATE MyTable SET MyField = MyFunction(MyField)
其中,MyFunction是这个问题的正确答案。
2个回答

6

这将为您提供所需的内容..8534788b-9000-4729-846b-81a3f49c9f91

select CONVERT(varchar(36),
0x38353334373838622D393030302D343732392D383436622D383161336634396339663931)

您需要将该值转换为varbinary,然后再转换回varchar。

以下是使用动态SQL的一种方法:

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

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

这让我完成了一半的工作,但是我如何获得varbinary呢?如果我执行 select convert(varbinary(max),'FF') 它会给我0x4646,而在我的情况下字符串应该是0xFF。 - csauve
谢谢!这肯定会起作用,我没有考虑使用动态SQL。 :) - csauve

1

如果您想将单个字符转换,可以使用CHAR函数,如下:

SELECT CHAR(0x38)

但是你必须记得在数字前加上0x,因为它是十六进制的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接