65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Microsoft SQL 将十六进制转换为整数

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.93/5 (6投票s)

2007年4月23日

CPOL

2分钟阅读

viewsIcon

79151

downloadIcon

330

一篇关于如何使用 Microsoft SQL 将十六进制转换为整数的文章

引言

我一直在寻找使用 Microsoft SQL 将包含十六进制值的字符串转换为整数值的方法,并且确实在互联网上找到了一些文章。有些文章转换的是十六进制值,而不是字符串。其中一些文章确实转换了字符串,但使用了循环,这些循环分别转换每个字符并将值相加来得到结果。所以我想应该有一种更合适的方法,仍然使用 Microsoft SQL 的转换函数。

背景

所以你可能想知道我为什么要转换这些数据。在我们的公司,我们必须处理硬件,例如检索和发送消息,其中大多数消息包含十六进制值。这些消息作为原始数据存储在表中。这张表是用户界面和硬件之间的缓冲区。这样做可以确保我们不会丢失任何数据,并且可以从任何地方和任何用户界面访问硬件,只要它支持数据库连接。此外,还必须对数据进行解析,使其对用户或用于其他功能具有代表性。

使用代码

这段代码使用起来非常简单,如果您从 Microsoft SQL 查询分析器或服务器管理工作室(如果您使用 Microsoft SQL 2005)执行它。它会创建一个名为 Stp_HexToInt 的存储过程,并且只需要一个参数。存储过程的返回值包含一个整数值。

存储过程本身如下

set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: KC
-- Create date: 20/04/07
-- Description: Convert Hex value to int
-- =============================================
CREATE PROCEDURE Stp_HexToInt
    @HexValue Varchar(20)
AS
BEGIN
    Declare @Query nvarchar(100)
    Declare @Parameters nvarchar(50)
    Declare @ReturnValue Int

    if (charindex('0x',@HexValue) = 0)
        Set @HexValue = '0x' + @HexValue


    Set @Query = N'Select @Result = Convert(int,' + @HexValue + ')'
    Set @Parameters = N'@Result int output'
    Exec master.dbo.Sp_executesql @Query, @Parameters, @ReturnValue Output

    RETURN @ReturnValue
END
GO

那么这段代码在做什么呢?

  • 添加一个前缀,以告知 Microsoft SQL 这是一种十六进制类型,以防字符串不是以正确的十六进制值传递。 FF 将被更改为 0xFF.
    if (charindex('0x',@HexValue) = 0)
        Set @HexValue = '0x' + @HexValue
    
  • 在运行时构建 Query ,其中包含您的十六进制值,但不再是字符串。现在,它在您的 Query 中变成了一个真正的十六进制值。
        Set @Query = N'Select @Result = Convert(int,' + @HexValue + ')'
    
  • 创建 result 参数作为 sp_executeSql 存储过程的输出。
        Set @Parameters = N'@Result int output'
    
  • 最后,执行您自己构建的 query ,它将转换十六进制值并在 @ReturnValue 参数中返回一个整数。
        Exec master.dbo.Sp_executesql @Query, @Parameters, @ReturnValue Output
    

测试存储过程

当然,这已经是众所周知的了,但对于初学者来说,这是如何测试它的方法。

Declare @Result int
execute @Result = stp_HexToInt '0xFF'
print @result

关注点

因为 Microsoft SQL 只能转换十六进制值,而不能转换包含十六进制值的字符串,所以我想在运行时构建代码并使用 Execute(@SQL) 执行它可以解决这个问题,但这里的问题是它没有返回值或参数(除非其他人可以证明相反)。所以我不得不找到一种从我自己的构建 Query 中获取结果的方法。

信不信由你,联机丛书仍然可以提供一些帮助,它告诉我 Sp_executesql 支持在执行您自己构建的 Query (在运行时)时使用参数。这就是我的解决方案。不要忘记,有些参数需要 "output",否则它们不会被赋值。

© . All rights reserved.