如何在TSQL中将二进制值打印为十六进制?

Tad*_*mas 34 t-sql sql-server

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

DECLARE @binvalue binary(4)
SET @binvalue = 0x12345678
PRINT CAST(@binvalue AS nvarchar)
Run Code Online (Sandbox Code Playgroud)

预期:

0×12345678

相反,它打印出两个乱码.

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

更新:这不是该行的唯一值,所以我不能只打印@binvalue.这更像PRINT N'其他东西'+ ???? + N'more stuff'.不确定这是否有所不同:我本身并没有尝试PRINT @binvalue.

Iho*_* B. 42

不要使用master.sys.fn_varbintohexstr- 它非常慢,没有文档,不受支持,并且可能在SQL Server的未来版本中消失.

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

convert(char(34), @binvalue, 1)
Run Code Online (Sandbox Code Playgroud)

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

我们尝试在一个有200000行的表上进行2次查询:

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
    Run Code Online (Sandbox Code Playgroud)
  2. select convert(char(34), field, 1)
    from table`
    
    Run Code Online (Sandbox Code Playgroud)

第一个运行2分钟,第二个运行4秒.

  • 这个有效,但我需要超过34个字符. (2认同)

Eri*_*ard 29

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

print master.sys.fn_varbintohexstr(@binvalue)
Run Code Online (Sandbox Code Playgroud)

我不认为2000年存在,所以你可能不得不自己动手.

  • 试过了,它非常非常慢,在我的情况下每秒 2 条记录(使用转换,每秒 260 条记录..) (2认同)

Cha*_*ato 22

select convert(varchar(max), field , 1) 
from table
Run Code Online (Sandbox Code Playgroud)

通过using varchar(max)你将不必担心指定大小(种).


Ian*_*oyd 8

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

我想将最高timestamp值转换为varchar

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users
Run Code Online (Sandbox Code Playgroud)

哪个返回:

LastTS
==================
0x000000000086862C
Run Code Online (Sandbox Code Playgroud)

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

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users
Run Code Online (Sandbox Code Playgroud)

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

扭转它

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

SELECT CAST(CONVERT(varbinary(50), '0x000000000086862C', 1) AS timestamp)
Run Code Online (Sandbox Code Playgroud)

注意:任何代码都会发布到公共领域。无需注明出处。