我正在使用SQL Server 2000从表中打印出一些值PRINT
.对于大多数非字符串数据,我可以转换为nvarchar以便能够打印它,但二进制值尝试使用字符的位表示进行转换.例如:
DECLARE @binvalue binary(4) SET @binvalue = 0x12345678 PRINT CAST(@binvalue AS nvarchar)
预期:
0×12345678
相反,它打印出两个乱码.
如何打印二进制数据的值?是否有内置或我需要自己滚动?
更新:这不是该行的唯一值,所以我不能只打印@binvalue.这更像PRINT N'其他东西'+ ???? + N'more stuff'.不确定这是否有所不同:我本身并没有尝试PRINT @binvalue.
不要使用
master.sys.fn_varbintohexstr
- 它非常慢,没有文档,不受支持,并且可能在SQL Server的未来版本中消失.
如果需要转换binary(16)
为十六进制字符,请使用convert
:
convert(char(34), @binvalue, 1)
为什么34?因为16*2 + 2 = 34
,这是"0x" - 2个符号,每个字符加2个符号.
我们尝试在一个有200000行的表上进行2次查询:
select master.sys.fn_varbintohexstr(field) from table`
select convert(char(34), field, 1) from table`
第一个运行2分钟,第二个运行4秒.
如果您使用的是Sql Server 2005,则可以使用:
print master.sys.fn_varbintohexstr(@binvalue)
我不认为2000年存在,所以你可能不得不自己动手.
select convert(varchar(max), field , 1) from table
通过using varchar(max)
你将不必担心指定大小(种).
添加一个答案,该答案显示了另一个将二进制数据转换为十六进制字符串然后再次返回的示例。
我想将最高timestamp
值转换为varchar
:
SELECT CONVERT( varchar(50), CAST(MAX(timestamp) AS varbinary(8)), 1) AS LastTS FROM Users
哪个返回:
LastTS ================== 0x000000000086862C
注意:使用CONVERT
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)
注意:任何代码都会发布到公共领域。无需注明出处。