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

有没有一种使用sql server/TSQL实现十六进制算术的简单方法?,sql,sql-server-2000,hex,Sql,Sql Server 2000,Hex,我在表中有一列十六进制值。我想给该表中的所有值添加一个十六进制值。如果它是一个简单的int,我会运行如下内容: UPDATE myTable SET num = num + 4000 有没有办法简单地使用十六进制算法来实现这一点?或者我必须将列值转换为十进制,将要添加的值转换为十进制,添加它们,然后将值转换回十六进制吗?(如果是,最简单的方法是什么?) (注意:我们目前正在使用sql server 2000。)您可以使用前缀0x 乙二醇 返回65 所以 (这在SQL 2008中有效-我不确定它

我在表中有一列十六进制值。我想给该表中的所有值添加一个十六进制值。如果它是一个简单的int,我会运行如下内容:

UPDATE myTable
SET num = num + 4000
有没有办法简单地使用十六进制算法来实现这一点?或者我必须将列值转换为十进制,将要添加的值转换为十进制,添加它们,然后将值转换回十六进制吗?(如果是,最简单的方法是什么?)


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

您可以使用前缀
0x
乙二醇

返回65

所以

(这在SQL 2008中有效-我不确定它是否是SQL 2000之后的新版本-请告诉我!)


如果您有两个0x值,它们由
+
运算符连接,因此使用convert将其中一个值转换为int

假设
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)
使用类似于:

print convert(varbinary(4),0 + 0x002E + 0x001D)
它会给你一个结果,比如:

0x0000004B

等式中的零欺骗了它,使它相信它的所有数字,因此它计算值。

为什么要将显然是数字的值存储为字符串?如果它们应该以十六进制的形式显示/输入给用户,那应该通过在远离数据库的地方格式化代码来完成。@Damien_,不信者-我认为这是为了阻止数字变得难以置信的大。不管怎样,这就是现在的情况,我必须处理它…这给了我一个错误-
数据类型的无效运算符。运算符等于add,类型等于varchar。
否,然后我得到错误:
将varchar值“7FFF”转换为数据类型为int的列时出现语法错误。
我认为错误与
num
有关,而不是0x4000So num不是int??我想你可能得走很长的路
print convert(varbinary(4),0 + 0x002E + 0x001D)
0x0000004B