2012-01-09 38 views
2

背景MSQL查詢獲取一個整數的十六進制值的int值

只給你來一點,我已經包括一些背景,爲什麼我試圖做到這一點:

我有一個表「CP」,其具有[ID]的字段,它爲每個註冊我來認識到這是從展開溶液,以基於作爲結果的雲移動標識符的多個帳戶將訪問相同的對象這將是最好的,如果他們都從1開始,因此而不是用我創立的int字段名爲標籤將在配合使用的帳戶ID找到每唯一的記錄ID字段ccount。

field  | type 
________________________ 
    id   | int 
    label  | int 
    account_id | int 

當註冊被打印出來,我希望他們能夠被顯示爲5位十六進制數,並在C#代碼,我可以簡單地做下面的屏幕上

value.ToString("X") 

但是我的問題存在與添加新標籤字段之前的數據庫中的現有條目相關聯。 我已經找到了類似的幾個問題,但沒有回答我的問題

的問題

我有IDS領域(1,2,3,----,11,12,13,...等)值1-9可以簡單地合併花衣在爲value.ToString(「X」)將乾脆什麼也不做這些值但是如果我只是複製的值11,但是我想它返回「11」,因此將返回「B」,這是正確的11 HEX值I需要一個SQL腳本,這將轉換11 => 17(其爲0×11的十六進制值),使得當所述應用程序讀取它它將值11輸出到屏幕上。

這是隻發生一次轉換的退出ID的這就是爲什麼我想要一個SQL腳本,做這一切在一個批次,而不是其建成應用。

什麼,我想會是這樣的下面,這樣它假定的價值將是一個十六進制值,並將其轉換回爲int。

SELECT CONVERT(INT, '0x' + id) FROM cp; 

我可以通過以下操作

int.Parse(value.ToString(),System.Globalization.NumberStyles.HexNumber).ToString() 

UPDATE獲得在C#中正確的效果:我已經找到了解決這個問題對我的使用情況,但有些混亂,引發外界我將在數據庫中完成所有我的轉換,我通過上面的SELECT語句進行了假設。澄清這是轉換現有記錄的一次性事件。注意下面的語句不起作用,但stackoverflow不會讓我編輯原始語句,因爲更改少於15個字符。

UPDATE [dbname].[dbo].[cp] set [Label] = CONVERT(INT, '0x' + id); 

回答

2

找到了答案,這是不漂亮,但所以我想我會與你分享它解決了我的問題。如果任何人有一個更簡單的解決方案,這將是偉大的,但同時在這裏我們去。

創建MSQL功能

CREATE FUNCTION ConvertFromBase 
( 
    @value AS VARCHAR(MAX), 
    @base AS BIGINT 
) RETURNS BIGINT AS BEGIN 

-- just some variables 
DECLARE @characters CHAR(36), 
     @result BIGINT, 
     @index SMALLINT; 

-- initialize our charater set, our result, and the index 
SELECT @characters = 'abcdefghijklmnopqrstuvwxyz', 
     @result = 0, 
     @index = 0; 

-- make sure we can make the base conversion. there can't 
-- be a base 1, but you could support greater than base 36 
-- if you add characters to the @charater string 
IF @base < 2 OR @base > 36 RETURN NULL; 

-- while we have characters to convert, convert them and 
-- prepend them to the result. we start on the far right 
-- and move to the left until we run out of digits. the 
-- conversion is the standard (base^index) * digit 
WHILE @index < LEN(@value) 
    SELECT @result = @result + POWER(@base, @index) * 
        (CHARINDEX 
         (SUBSTRING(@value, LEN(@value) - @index, 1) 
         , @characters) - 1 
        ), 
      @index = @index + 1; 

-- return the result 
RETURN @result; 

END 

然後,只需執行以下查詢

UPDATE [cp] SET label = dbo.ConvertFromBase(id,16); 

該解決方案被發現在http://dpatrickcaldwell.blogspot.com/2009/05/converting-hexadecimal-or-binary-to.html

1

你不應該做你的號碼在SQL格式。讓ints以數據形式出現在數據庫中,並將它們格式化爲表示層。你完全沒有提到這個表示層是什麼,所以不可能多說,但如果你這樣做,當你的老闆出現並說某些用戶想看到十六進制,並且有些人想看基10。

+2

表示層是c#,因爲我認爲會在問題中指出,我不是在SQL中進行HEX轉換。在整個板子中,我只想要一個轉換器來處理現有記錄,而且它似乎是有意義的使用sql查詢來做到這一點,然後業務層可以處理任何新的記錄。只需一次使用即可將代碼構建到業務層中。 – kamui 2012-01-09 12:11:30

+1

另外,轉換的原因是可以顯示的字符數是5,小數點是有限的100,000個記錄,現在發現它們對於我們的情況來說太低,其中十六進制數可以有1,048,576條記錄。因此,不會有客戶需要查看base-10值的情況,不幸的是,由於字符混淆O => 0和l => 1,所以我不能使用base-36,所以我被HEX atm卡住但至少我現在給客戶提供了目前規格範圍內的可能記錄數量的10倍。 – kamui 2012-01-09 12:27:28