我尝试使用 TSQL,但当值在变量内时,将十六进制转换为十进制时遇到了一些问题。
我的代码是:
SET @hex = SUBSTRING(@x,1,2) --give 1e
SET @hex = '0x' + @hex
SELECT CAST (@hex AS int)
将 varchar 值转换为 int 时出现转换失败的错误
我不知道它出了什么问题,到目前为止我找不到解决方案
任何想法?谢谢
我尝试使用 TSQL,但当值在变量内时,将十六进制转换为十进制时遇到了一些问题。
我的代码是:
SET @hex = SUBSTRING(@x,1,2) --give 1e
SET @hex = '0x' + @hex
SELECT CAST (@hex AS int)
将 varchar 值转换为 int 时出现转换失败的错误
我不知道它出了什么问题,到目前为止我找不到解决方案
任何想法?谢谢
这有效(适用于 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 和 CONVERT页面上的“二进制样式” 。
我不认为 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 注入攻击,并且您可能希望将其放入函数或存储过程中
CREATE FUNCTION dbo.FN_HEXTOINT(@HEX varchar(MAX) = NULL)
RETURNS @RETORNO TABLE(INTHEX INT)
AS
BEGIN
SET @HEX = UPPER(@HEX)
DECLARE @TABHEX VARCHAR(16) = '0123456789ABCDEF'
DECLARE @CHARX VARCHAR(1)
DECLARE @POSCHARX INT
DECLARE @BASE INT = 16
DECLARE @I INT = LEN(@HEX)
DECLARE @LENSTR INT = LEN(@HEX)
DECLARE @EXPOENTE INT = 36
DECLARE @N10 FLOAT = 0.01
WHILE (@I> 0)
BEGIN
SET @CHARX = SUBSTRING (@HEX, @i,1)
SET @POSCHARX = PATINDEX('%'+@CHARX+'%', @TABHEX);
IF @POSCHARX > 0
BEGIN
SET @N10 = @N10 + ((@POSCHARX - 1) * POWER(@BASE, (@LENSTR-@I)))
END
SET @I = @I - 1
END
INSERT INTO @RETORNO
SELECT (ROUND(@N10 + 0.001,1)) AS RET
RETURN
END