有没有一种使用sql server / TSQL进行十六进制算术的简单方法?

时间:2012-09-03 07:55:05

标签: sql sql-server-2000 hex

我在表格中有一列十六进制值。我想为该表中的所有值添加十六进制值。如果它是一个简单的int我会运行这样的东西:

UPDATE myTable
SET num = num + 4000

有没有办法简单地使用十六进制算术?或者我必须将列值转换为十进制,将我想要添加的值转换为十进制,添加它们,并将值转换回十六进制? (如果是这样,最简单的方法是什么?)

(注意:我们目前正在使用sql server 2000。)

3 个答案:

答案 0 :(得分:4)

使用类似的东西:

print convert(varbinary(4),0 + 0x002E + 0x001D)

它应该给你一个结果:

0x0000004B

等式中的零点使它相信所有数字,因此它会计算出值。

答案 1 :(得分:1)

假设num实际上是十六进制数字的字符串表示,我认为您可以使用几个用户定义函数将其转换为整数:

-- Based on Feodor's solution on
-- http://blog.sqlauthority.com/2010/02/01/sql-server-question-how-to-convert-hex-to-decimal/
CREATE FUNCTION fn_HexToInt(@str varchar(16))
RETURNS BIGINT AS BEGIN

SELECT @str=upper(@str)
DECLARE @i int, @len int, @char char(1), @output bigint
SELECT @len=len(@str),@i=@len, @output=case  WHEN @len>0 THEN 0 END

WHILE (@i>0)
BEGIN
    SELECT @char=substring(@str,@i,1)
         , @output=@output
                    +(ASCII(@char)
                        -(case when @char between 'A' and 'F' then 55
                          else case when @char between '0' and '9' then 48 end
                          end))
                                *power(16.,@len-@i)
        ,  @i=@i-1
END
RETURN @output
END

-- Example conversion back to hex string - not very tested
CREATE FUNCTION fn_IntToHex(@num int)
    RETURNS VARCHAR(16) AS BEGIN
    DECLARE @output varchar(16), @rem int
    SELECT @output = '', @rem=0
    WHILE (@num > 0)
    BEGIN   
        SELECT @rem = @num % 16
        SELECT @num = @num / 16
        SELECT @output = char(@rem + case when @rem between 0 and 9 then 48 else 55 end) + @output 
    END
    RETURN @output
END

select dbo.fn_HexToInt ('7FFF') -- = 32767
select dbo.fn_IntToHex(32767) -- = 7FFF

所以你可以试试

UPDATE myTable
SET num = dbo.fn_IntToHex(dbo.fn_HexToInt(num) + 4000)

答案 2 :(得分:0)

您可以使用前缀0x 例如

Select 0x3F + 2

返回65

所以

UPDATE myTable 
SET num = num + 0x4000 

(这适用于SQL 2008 - 我不确定自SQL 2000以来它是否是新的 - 请告诉我!)

如果你有两个0x值,它们会被+运算符连接起来,所以使用convert将其中一个转换为int