2013-10-09 78 views
1

我嘗試使用TSQL,並且在值位於變量內時出現了將十六進制轉換爲十進制的問題。T-SQL將十六進制轉換爲十進制

我的代碼是:

SET @hex = SUBSTRING(@x,1,2) --give 1e 
SET @hex = '0x' + @hex 
SELECT CAST (@hex AS int) 

我得到的錯誤轉換爲varchar值爲int

我不知道什麼是錯的,到目前爲止,我無法找到當轉換失敗解決方案

任何想法?謝謝

回答

5

此作品(用於SQL Server 2008或更高版本):

declare @hex varchar(316) 
SET @hex = '1e' --SUBSTRING(@x,1,2) --give 1e 
SET @hex = '0x' + @hex 
SELECT CONVERT(int,CONVERT (binary(1),@hex,1)) 

CAST and CONVERT頁上的 「二元樣式」。

+0

我跑你的查詢,它給出的結果爲48.但十六進制1e的十進制是30.任何想法,爲什麼發生這種情況? – th1rdey3

+1

@ th1rdey3 - 當我在我的機器上運行它時,它給出的結果是30.當我在2005服務器上運行它時,它給出了48.這就是爲什麼我說它是在2008或更高版本中。對於2005,它的行爲方式與'0'風格相同 - 它告訴你'0'的ASCII值是48. –

+1

@Damien_The_Unbeliever有趣的區別,你能解釋'SQL Server之前和之後'CONVERT'之間的區別究竟是什麼2008'?找不到您的答案的鏈接。 – DrCopyPaste

1

我不認爲T-SQL可以明確地將一個十六進制字符串轉換爲數字,但它可以轉換一個十六進制數字,這樣你就可以欺騙它來做你想做的事情。就像這樣:

DECLARE @hex nvarchar(20) 
DECLARE @select nvarchar(200) 
DECLARE @parm nvarchar(200) 
DECLARE @retVal int 
SET @hex = '0x1e' 
SET @select = 'SELECT @retVal = CAST(' + @hex + ' AS int)' 
SET @parm = '@retVal int OUTPUT' 
EXEC sp_executesql @select, @parm, @retVal OUTPUT 
SELECT @retVal 

你會想驗證@hex從SQL注入攻擊保護,你可能會希望把這個函數或存儲過程

相關問題