2012-09-03 44 views
2

我在表中有一列十六進制值。我想爲該表中的所有值添加一個十六進制值。如果它是一個簡單的INT我會跑是這樣的:有沒有簡單的方法來使用sql server/TSQL做十六進制運算?

UPDATE myTable 
SET num = num + 4000 

有沒有辦法做到這一點只需使用十六進制算法?或者我必須將列值轉換爲十進制,將我想要添加的值轉換爲十進制,添加它們,然後將值轉換回十六進制? (如果是的話,什麼是應該做的是最簡單的方法是什麼?)

(注:目前,我們正在使用SQL Server 2000)

+0

爲什麼你存儲顯然意味着數值爲* strings *的值?如果它們應該以用戶的十六進制格式顯示/輸入,應該通過遠離數據庫格式化代碼來完成。 –

+0

@Damien_The_Unbeliever - 我認爲這是爲了阻止數字變得難以置信。無論哪種方式,這是現在的方式,我必須使用它... – froadie

回答

0

您可以使用前綴0x

Select 0x3F + 2 

回報65

所以

UPDATE myTable 
SET num = num + 0x4000 

(這項工作在SQL 2008 - 我不知道它是否是新的,因爲SQL 2000 - 讓我知道!)

如果你有兩個0x值,他們得到連接+運算符,所以使用轉換將其中一個轉換爲一個int

+0

這給了我錯誤 - 數據類型無效的運算符。運算符等於add,類型等於varchar.' – froadie

+0

'convert(int,0x4000)'工作嗎? – podiluska

+0

不,然後我得到的錯誤:'將varchar值'7FFF'轉換爲數據類型爲int的列的語法錯誤'我認爲錯誤與'num',而不是0x4000 – froadie

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),@[email protected], @output=case WHEN @len>0 THEN 0 END 

WHILE (@i>0) 
BEGIN 
    SELECT @char=substring(@str,@i,1) 
     , @[email protected] 
        +(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.,@[email protected]) 
     , @[email protected] 
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) 
4

使用類似:

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

它應該給你喜歡的結果:

0x0000004B 

在傻瓜式的零它相信它的所有號碼所以計算值。

相關問題