Tsql T-SQL将十六进制转换为十进制

Tsql T-SQL将十六进制转换为十进制,tsql,Tsql,我尝试使用TSQL,当值位于变量内部时,将十六进制转换为十进制会遇到一些问题 我的代码是: SET @hex = SUBSTRING(@x,1,2) --give 1e SET @hex = '0x' + @hex SELECT CAST (@hex AS int) 我得到一个错误,将varchar值转换为int时转换失败 我不知道出了什么问题,到目前为止我还没有找到解决办法 有什么想法吗?谢谢我不认为t-SQL可以显式地将十六进制字符串转换为数字,但它可以转换十六进制数字,这样您就可以在某种

我尝试使用TSQL,当值位于变量内部时,将十六进制转换为十进制会遇到一些问题

我的代码是:

SET @hex = SUBSTRING(@x,1,2) --give 1e
SET @hex = '0x' + @hex
SELECT CAST (@hex AS int)
我得到一个错误,将varchar值转换为int时转换失败

我不知道出了什么问题,到目前为止我还没有找到解决办法


有什么想法吗?谢谢

我不认为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注入攻击,并且您可能希望将其放入函数或存储过程中(对于SQL Server 2008或更高版本):


请参阅页面上的“二进制样式”。

我运行了您的查询,结果为48。但十六进制1e的小数点是30。知道为什么会这样吗?@th1rdey3-当我在我的机器上运行它时,它给出的结果是30。当我在2005年的服务器上运行它时,它给出了48。这就是为什么我说是2008年或更晚。对于2005年,它的作用与样式
0
的描述相同-它告诉您
0
的ASCII值是48。@Damien_这是一个非常有趣的区别,您能否解释一下
转换
SQL Server 2008
之前和之后的区别?在您答案的链接中找不到该选项。@DrCopyPaste-区别在于他们开始使用
style
参数来转换二进制值。然后,现有的转换行为被记录为style
0
,并且添加了style
1
2
,专门用于十六进制转换。@Damien_不信者,你知道我们如何在2005年进行转换吗?
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))