4

我尝试使用 TSQL,但当值在变量内时,将十六进制转换为十进制时遇到了一些问题。

我的代码是:

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

将 varchar 值转换为 int 时出现转换失败的错误

我不知道它出了什么问题,到目前为止我找不到解决方案

任何想法?谢谢

4

3 回答 3

9

这有效(适用于 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页面上的“二进制样式” 。

于 2013-10-09T07:24:30.000 回答
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 注入攻击,并且您可能希望将其放入函数或存储过程中

于 2013-10-09T07:22:09.040 回答
0
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    
于 2022-01-25T12:54:15.500 回答