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






3.93/5 (6投票s)
一篇关于如何使用 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",否则它们不会被赋值。