【问题标题】:Is there a simple way to do hexadecimal arithmetic using sql server/TSQL?有没有使用 sql server/TSQL 进行十六进制算术的简单方法?
【发布时间】:2012-09-03 07:55:04
【问题描述】:

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

UPDATE myTable
SET num = num + 4000

有什么方法可以简单地使用十六进制算术吗?还是我必须将列值转换为十进制,将我要添加的值转换为十进制,添加它们,然后将值转换回十六进制? (如果是这样,最简单的方法是什么?)

(注意:我们目前使用的是 sql server 2000。)

【问题讨论】:

  • 为什么要将明显是数字的值存储为字符串?如果它们应该为用户显示/输入为十六进制,则应该通过远离数据库的格式化代码来完成。
  • @Damien_The_Unbeliever - 我认为这是为了阻止数字变得异常庞大。不管怎样,现在就是这样,我必须努力……

标签: sql sql-server-2000 hex


【解决方案1】:

使用类似的东西:

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

它应该给你这样的结果:

0x0000004B

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

【讨论】:

    【解决方案2】:

    假设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)
    

    【讨论】:

      【解决方案3】:

      您可以使用前缀0x 例如

      Select 0x3F + 2
      

      返回 65

      所以

      UPDATE myTable 
      SET num = num + 0x4000 
      

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

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

      【讨论】:

      • 这给了我错误 - Invalid operator for data type. Operator equals add, type equals varchar.
      • 不,然后我得到错误:Syntax error converting the varchar value '7FFF' to a column of data type int. 我认为错误是num,而不是 0x4000
      • 那么 num 不是 int 吗?我想你可能需要走很长的路
      猜你喜欢
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-30
      • 2013-01-11
      • 2018-01-19
      相关资源
      最近更新 更多