我在表中有一列十六进制值。我想为该表中的所有值添加一个十六进制值。如果它是一个简单的 int 我会运行这样的东西:
UPDATE myTable
SET num = num + 4000
有没有办法简单地使用十六进制算术来做到这一点?还是我必须将列值转换为十进制,将我要添加的值转换为十进制,添加它们,然后将值转换回十六进制?(如果是这样,最简单的方法是什么?)
(注意:我们目前使用的是 sql server 2000。)
我在表中有一列十六进制值。我想为该表中的所有值添加一个十六进制值。如果它是一个简单的 int 我会运行这样的东西:
UPDATE myTable
SET num = num + 4000
有没有办法简单地使用十六进制算术来做到这一点?还是我必须将列值转换为十进制,将我要添加的值转换为十进制,添加它们,然后将值转换回十六进制?(如果是这样,最简单的方法是什么?)
(注意:我们目前使用的是 sql server 2000。)
使用类似的东西:
print convert(varbinary(4),0 + 0x002E + 0x001D)
它应该给你一个类似的结果:
0x0000004B
等式中的零会欺骗它相信它的所有数字,因此它会计算值。
假设这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)
您可以使用前缀,0x
例如
Select 0x3F + 2
返回 65
所以
UPDATE myTable
SET num = num + 0x4000
(这适用于 SQL 2008 - 我不确定它是否是 SQL 2000 以来的新功能 - 请告诉我!)
如果您有两个 0x 值,它们会被+
运算符连接起来,因此请使用 convert 将其中一个转换为 int