MS SQL服务器 - 将HEX字符串转换为整数

mic*_*ica 20 sql-server sql-server-2005

这回答看起来像是同一个问题:

将整数转换为十六进制,将十六进制转换

..对我不起作用.

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

谢谢

编辑以包含示例:

选择CONVERT(INT,0x89)

按预期工作,但是

从sometable中选择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)2009年9月6日01:43:32版权所有(c)1988-2005 Microsoft Corporation在Windows NT 5.1上具有高级服务的Express Edition(Build 2600:Service Pack 3)

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

Pon*_*ife 33

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

select convert(int, convert(varbinary, '0x89', 1))
Run Code Online (Sandbox Code Playgroud)

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

  • 使用UDF(TSQL或CLR;实际上CLR可能更容易)
  • 将SELECT包装在一个存储过程中(但是你可能仍然相当于一个UDF)
  • 在应用程序前端转换它
  • 升级到MSSQL 2008

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

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

  • @ carl.anderson [此行为已明确记录:](https://msdn.microsoft.com/en-us/library/ms187928.aspx#Anchor_8)"表达式必须由偶数个十六进制数字组成.如果表达式包含奇数个字符......则会引发错误." (2认同)