关于sql server:如何在SQL中将二进制值打印为十六进制?

关于sql server:如何在SQL中将二进制值打印为十六进制?

How can I print a binary value as hex in TSQL?

我正在使用SQL Server 2000使用PRINT从表中打印出一些值。 对于大多数非字符串数据,我可以将其强制转换为nvarchar以便进行打印,但是二进制值尝试使用字符的位表示形式进行转换。 例如:

1
2
3
DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)

预期:

0x12345678

而是打印两个乱码。

如何打印二进制数据的值? 是否有内置的或需要自己滚动的?

更新:这不是行上的唯一值,所以我不能只是PRINT @binvalue。 它更像是PRINT N'other stuff'+ ???? +还有更多内容。 不知道这是否有所不同:我自己并没有尝试PRINT @binvalue。


Do not use master.sys.fn_varbintohexstr - it is terribly slow, undocumented, unsupported, and might go away in a future version of SQL Server.

如果需要将binary(16)转换为十六进制字符,请使用convert

1
convert(char(34), @binvalue, 1)

为什么是34?因为16*2 + 2 = 34,即" 0x"-2个符号,每个字符加2个符号。

我们尝试对具有200000行的表进行2个查询:

  • 1
    2
    select master.sys.fn_varbintohexstr(field)
    from table`
  • 1
    2
    select convert(char(34), field, 1)
    from table`
  • 第一个运行2分钟,而第二个-4秒。


    如果您使用的是Sql Server 2005,则可以使用以下命令:

    1
    print master.sys.fn_varbintohexstr(@binvalue)

    我认为这在2000年并不存在,因此您可能必须自己动手。


    1
    2
    select convert(varchar(max), field , 1)
    from table

    通过using varchar(max),您不必担心指定大小(种类)。


    添加一个答案,该答案显示了另一个将二进制数据转换为十六进制字符串然后再次返回的示例。

    我想将最高的timestamp值转换为varchar

    1
    2
    3
    4
    5
    6
    SELECT
       CONVERT(
          varchar(50),
          CAST(MAX(timestamp) AS varbinary(8)),
          1) AS LastTS
    FROM Users

    哪个返回:

    1
    2
    3
    LastTS
    ==================
    0x000000000086862C

    注意:使用convert转换varbinary -> varchar很重要。使用CAST将不起作用:

    1
    2
    3
    4
    5
    SELECT
       CAST(
          CAST(MAX(timestamp) AS varbinary(8))
          AS varchar(50) ) AS LastTS
    FROM Users

    将二进制数据视为字符而不是十六进制值,并返回一个空字符串。

    扭转它

    要将存储的十六进制字符串转换回时间戳:

    1
    SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)

    Note: Any code is released into the public domain. No attribution required.


    我在打印SQL Server 2005中从"哈希字节"函数返回的十六进制值时寻找类似问题的解决方案时遇到了这个问题。

    可悲的是,在此版本的SQL Server中,CONVERT似乎根本不起作用,只有fn_varbintohexsubstring可以执行正确的操作:

    我做了:

    1
    2
    3
    4
    5
    6
    7
    DECLARE @binvalue binary(4)
    SET @binvalue = 0x12345678
    PRINT 'cast(@binvalue AS nvarchar): ' + CAST(@binvalue AS nvarchar)
    PRINT 'convert(varchar(max), @binvalue, 0): ' + CONVERT(varchar(max), @binvalue, 0)
    PRINT 'convert(varchar(max), @binvalue, 1): ' + CONVERT(varchar(max), @binvalue, 1)
    PRINT 'convert(varchar(max), @binvalue, 2): ' + CONVERT(varchar(max), @binvalue, 2)
    print 'master.sys.fn_varbintohexstr(@binvalue): ' + master.sys.fn_varbintohexstr(@binvalue)

    这是我在SQL Server 2005中获得的结果(

    1
    2
    3
    4
    5
    cast(@binvalue AS nvarchar): ?硖
    convert(varchar(max), @binvalue, 0): 4Vx
    convert(varchar(max), @binvalue, 1): 4Vx
    convert(varchar(max), @binvalue, 2): 4Vx
    master.sys.fn_varbintohexstr(@binvalue): 0x12345678

    (实际上在'4Vx'之前有一个不可打印的字符-我会发布图像,但我的积分不足。)

    编辑:仅添加-在SQL Server 2008 R2上,CONVERT的问题已通过以下输出修复:

    1
    2
    3
    4
    5
    cast(@binvalue AS nvarchar): ?硖
    convert(varchar(max), @binvalue, 0): 4Vx
    convert(varchar(max), @binvalue, 1): 0x12345678
    convert(varchar(max), @binvalue, 2): 12345678
    master.sys.fn_varbintohexstr(@binvalue): 0x12345678

    1
    2
    3
    4
    5
    DECLARE @binvalue binary(4)
    SET @binvalue = 0x61000000
    PRINT @binvalue
    PRINT cast('a' AS binary(4))
    PRINT cast(0x61 AS varchar)

    不要投。

    转换将特定数据库的相应排序规则设置上的二进制值转换为文本。

    [开始编辑]
    如果需要字符串变量中的打印值,请使用Eric Z Beard建议的功能。

    1
    2
    3
    4
    5
    DECLARE @mybin1 binary(16)
    DECLARE @s varchar(100)
    SET @mybin1 = 0x098F6BCD4621D373CADE4E832627B4F6
    SET @s = 'The value of @mybin1 is: ' + sys.fn_varbintohexsubstring(0, @mybin1,1,0)
    PRINT @s

    如果由于服务器版本或需要特殊权限而无法使用此功能,则可以创建自己的功能。

    要查看该功能在SQL Server 2005 Express版中是如何实现的,可以执行以下操作:

    1
    sp_helptext 'fn_varbintohexsubstring'


    推荐阅读