我正在使用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' |