37

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

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

预期的:

0x12345678

相反,它会打印两个乱码。

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

更新:这不是唯一的值,所以我不能只打印@binvalue。它更像是 PRINT N'other stuff' + ???? + N'更多的东西'。不确定这是否会有所不同:我并没有单独尝试 PRINT @binvalue。

4

7 回答 7

46

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

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

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

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

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

  1. select master.sys.fn_varbintohexstr(field)
    from table`
    
  2. select convert(char(34), field, 1)
    from table`
    

第一个运行 2 分钟,而第二个运行 - 4 秒。

于 2012-08-18T06:23:34.430 回答
29

如果你在 Sql Server 2005 上,你可以使用这个:

print master.sys.fn_varbintohexstr(@binvalue)

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

于 2008-09-16T02:23:39.303 回答
23
select convert(varchar(max), field , 1) 
from table

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

于 2012-09-23T05:04:08.987 回答
10

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

我想将最高timestamp值转换为varchar

SELECT 
   CONVERT(
      varchar(50), 
      CAST(MAX(timestamp) AS varbinary(8)), 
      1) AS LastTS
FROM Users

返回:

LastTS
==================
0x000000000086862C

注意:重要的是你CONVERT用来转换varbinary -> varchar。使用CAST将不起作用:

SELECT 
   CAST(
      CAST(MAX(timestamp) AS varbinary(8)) 
      AS varchar(50) ) AS LastTS
FROM Users

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

扭转它

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

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

注意:任何代码都会发布到公共领域。无需归属。

于 2013-07-30T15:26:36.177 回答
2
DECLARE @binvalue binary(4)
SET @binvalue = 0x61000000
PRINT @binvalue 
PRINT cast('a' AS binary(4))
PRINT cast(0x61 AS varchar)

不要施放。

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

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

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 版本中是如何实现的,您可以执行:

sp_helptext 'fn_varbintohexsubstring'
于 2008-09-16T02:21:33.957 回答
2

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

可悲的是,在这个版本的 SQL Server 中,CONVERT 似乎根本不起作用,只有 fn_varbintohexsubstring 做正确的事情:

我做了:

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 中得到的结果(

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's 之前实际上有一个不可打印的字符 - 我会发布一张图片,但我还没有足够的分数)。


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

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
于 2013-10-16T09:18:34.243 回答
0

主题中的 tl;dr 真的太多了 :( 将尝试按照这个答案修复它。

with 
sq1 as (select '41424344' as v), -- this is 'ABCD'
-- Need binary size, otherwise it sets binary(30) in my case
sq2 as (select v, convert(binary(4), v, 2) as b from sq1), 
sq3 as (select b, v, convert(varchar, b, 2) as v1 from sq2)
--
select b, v, v1 from sq3
where v = v1
;

输出是:

b   |v       |v1      |
----|--------|--------|
ABCD|41424344|41424344|

另见:文档

于 2020-12-05T18:36:51.803 回答