【问题标题】:MS SQL server - convert HEX string to integerMS SQL 服务器 - 将 HEX 字符串转换为整数
【发布时间】:2011-04-05 23:58:03
【问题描述】:

这个看似相同问题的答案:

Convert integer to hex and hex to integer

..不适合我。

我无法使用 MS SQL Server 2005 CAST 或 CONVERT 将 HEX 字符串转换为整数。我错过了一些微不足道的事情吗?我进行了广泛的搜索,我能找到的最好的是冗长的用户函数,可以从十六进制字符串值变成看起来像十进制整数的东西。当然有一种简单的方法可以直接在查询中使用内置函数而不是编写用户函数来执行此操作?

谢谢

编辑以包含示例:

选择转换(INT,0x89)

按预期工作,但是

从某个表中选择 CONVERT(INT, '0x' + substring(msg, 66, 2))

得到我:

“将 varchar 值 '0x89' 转换为数据类型 int 时转换失败。”

一个额外显式的 CAST:

选择 CONVERT(INT, CAST('0x89' AS VARBINARY))

执行,但返回 813185081。

用“Int”、“Decimal”等替换“Varbinary”会导致错误。通常,如果需要,看起来是数字的字符串会被解释为数字,但在这种情况下不会,并且似乎没有识别 HEX 的 CAST。我想有一些简单明了的东西,我只是错过了。

Microsoft SQL Server Management Studio Express 9.00.3042.00

Microsoft SQL Server 2005 - 9.00.3080.00 (Intel X86) Sep 6 2009 01:43:32 版权所有 (c) 1988-2005 Microsoft Corporation Express Edition with Advanced Services on Windows NT 5.1 (Build 2600: Service Pack 3)

总结一下:我想取一个十六进制字符串,它是表中的一个值,并将其作为十进制整数的查询结果的一部分显示,仅使用系统定义的函数,而不是 UDF。

【问题讨论】:

  • 您是否遇到特定错误或意外结果?示例会很有帮助。
  • 你见过这个吗?看cmets...blog.sqlauthority.com/2010/02/01/…
  • 这是我搜索时出现的第一批帖子之一。这些答案中的每一个要么使用用户函数、DLL(用于大声哭泣!),要么建议使用迄今为止我无法使用的内置 CONVERT。使用它的建议似乎被许多没有自己测试过的人复制了很多次。
  • 我认为您将不得不为此使用 UDF:digitalcolony.com/2007/06/…
  • “不起作用是什么意思”? CONVERT() 是一个内置函数,它不太可能不起作用。因此,请发布您的 MSSQL 版本和版本,以及从您链接到的答案中运行两个 SELECT 查询的结果:SELECT CONVERT(VARBINARY(8), 16777215) 和 SELECT CONVERT(INT, 0xFFFFFF)

标签: sql-server sql-server-2005


【解决方案1】:

感谢您提供一些更明确的示例。据我从文档和谷歌搜索中可以看出,如果没有 UDF 或其他程序代码,这在 MSSQL 2005 中是不可能的。在 MSSQL 2008 中,CONVERT() 函数的 style 参数现在支持二进制数据,因此您可以直接这样做:

select convert(int, convert(varbinary, '0x89', 1))

在以前的版本中,您的选择是:

  • 使用 UDF(TSQL 或 CLR;CLR 实际上可能更容易做到这一点)
  • 将 SELECT 包装在一个存储过程中(但无论如何,您可能仍会在其中拥有相当于 UDF)
  • 在应用程序前端进行转换
  • 升级到 MSSQL 2008

如果转换数据只是为了显示目的,应用程序可能是最简单的解决方案:数据格式通常属于那里。如果您必须在查询中执行此操作,那么 UDF 是最简单的,但性能可能不是很好(我知道您说过您更喜欢不使用 UDF,但不清楚为什么)。我猜仅仅为此升级到 MSSQL 2008 可能是不现实的。

最后,仅供参考,您包含的版本号是 Management Studio 的版本,而不是您的服务器的版本号。为此,请使用select @@versionselect serverproperty('ProductVersion') 查询服务器本身。

【讨论】:

  • 谢谢,谢谢你让我澄清我的问题。我寻找我拥有的 Convert 版本的 Style 参数,认为它可能在那里,但没有找到。这是一个临时查询(没有应用程序),我希望通过添加 UDF 来避免调整数据库。在某个时候,它可能会成为应用程序的一部分,所有这些问题都会消失。
  • 有趣的是,这不起作用:select convert(int, convert(varbinary, '0x1', 1)) 但这样做:select convert(int, convert(varbinary, '0x01', 1)) 出于某种原因,0x 之后的前导零对于单个数字字符串很重要。
  • @carl.anderson This behaviour is explicitly documented: "表达式必须由偶数个十六进制数字组成...如果表达式包含奇数个字符...则会引发错误。"
  • 也适用于我获取 unicode 文本字符......对使用 "\uNNNN" 而不是正确的 unicode 文本清理 ascii 字符串数据有很大帮助...... ie---select nchar(convert (int, convert(varbinary, '0x56fd', 1)))
猜你喜欢
  • 1970-01-01
  • 2016-08-28
  • 2016-09-20
  • 1970-01-01
  • 2016-06-04
  • 2014-09-23
  • 2020-11-13
  • 2018-05-29
  • 1970-01-01
相关资源
最近更新 更多