2013-10-09 46 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注入攻击保护,你可能会希望把这个函数或存储过程

相关问题