所以我signal_data
在Sybase中有这个查询工作(哪一个是列)但它在Microsoft SQL Server中不起作用:
HEXTOINT(SUBSTRING((INTTOHEX(signal_data)),5,2)) as Signal
我也在Excel(A1
包含值)中有它:
=HEX2DEC(LEFT(DEC2HEX(A1),LEN(DEC2HEX(A1))-2))
有谁知道如何在SQL Server中执行此操作?
将INT转换为十六进制:
SELECT CONVERT(VARBINARY(8), 16777215)
将十六进制转换为INT:
SELECT CONVERT(INT, 0xFFFFFF)
上面的例子有一个限制,它只有在HEX值作为整数文字给出时才有效.为了完整性,如果要转换的值是十六进制字符串(例如在varchar列中找到),请使用:
-- If the '0x' marker is present: SELECT CONVERT(INT, CONVERT(VARBINARY, '0x1FFFFF', 1)) -- If the '0x' marker is NOT present: SELECT CONVERT(INT, CONVERT(VARBINARY, '1FFFFF', 2))
注意:该字符串必须包含偶数个十六进制数字.奇数位数将产生错误.
更多细节可以在CAST和CONVERT(Transact-SQL)的"二进制样式"部分找到.我相信SQL Server 2008或更高版本是必需的.
实际上,内置函数名为master.dbo.fn_varbintohexstr.
所以,例如:
SELECT 100, master.dbo.fn_varbintohexstr(100)
给你
100 0x00000064
SQL Server与Excel的基于字符串的DEC2HEX,HEX2DEC函数等效:
--Convert INT to hex string: PRINT CONVERT(VARCHAR(8),CONVERT(VARBINARY(4), 16777215),2) --DEC2HEX --Convert hex string to INT: PRINT CONVERT(INT,CONVERT(VARBINARY(4),'00FFFFFF',2)) --HEX2DEC
将int转换为十六进制:
SELECT FORMAT(512+255,'X')
可以使用SQL Server 2012及更高版本上提供的FORMAT功能
select FORMAT(10,'x2')
结果是:
0a
这是SQL服务器的函数,它将整数值转换为其十六进制表示形式为varchar.应该很容易适应其他数据库类型
例如:
SELECT dbo.ToHex(4095) --> FFF
SQL:
CREATE FUNCTION ToHex(@value int) RETURNS varchar(50) AS BEGIN DECLARE @seq char(16) DECLARE @result varchar(50) DECLARE @digit char(1) SET @seq = '0123456789ABCDEF' SET @result = SUBSTRING(@seq, (@value%16)+1, 1) WHILE @value > 0 BEGIN SET @digit = SUBSTRING(@seq, ((@value/16)%16)+1, 1) SET @value = @value/16 IF @value <> 0 SET @result = @digit + @result END RETURN @result END GO
传统的4位十六进制非常直接。十六进制字符串到整数(假定值存储在名为FHexString的字段中):
CONVERT(BIGINT,CONVERT(varbinary(4), (SELECT master.dbo.fn_cdc_hexstrtobin( LEFT(FMEID_ESN,8) )) ))
十六进制字符串的整数(假定值存储在名为FInteger的字段中):
(SELECT master.dbo.fn_varbintohexstr(CONVERT(varbinary,CONVERT(int, FInteger ))))
需要注意的重要一点是,当您开始使用引起寄存器共享的位大小时,尤其是在intel机器上,由于Intel的小尾数性质,寄存器中的高,低,左和右将被交换。例如,当使用varbinary(3)时,我们正在谈论的是6个字符的十六进制。在这种情况下,您的位将从右到左配对为以下索引“ 54,32,10”。在英特尔系统中,您会期望“ 76,54,32,10”。由于您仅使用8个中的6个,因此需要记住自己进行交换。“ 76,54”将成为您的左侧,“ 32,10”将成为您的右侧。逗号将您的高低分开。英特尔交换高点和低点,然后交换左和右。因此,要进行转换...例如,您必须自己进行交换,
(SELECT master.dbo.fn_replvarbintoint( CONVERT(varbinary(3),(SELECT master.dbo.fn_cdc_hexstrtobin( --intel processors, registers are switched, so reverse them ----second half RIGHT(FHex8,2)+ --0,1 (0 indexed) LEFT(RIGHT(FHex8,4),2)+ -- 2,3 (oindex) --first half LEFT(RIGHT(FHex8,6),2) --4,5 ))) ))
这有点复杂,所以我将尝试保持转换为8个字符的十六进制(varbinary(4))。
总之,这应该可以回答您的问题。全面地。