1

我有这样的价值

DECLARE @hex VARCHAR(64) = '00E0'

我需要将此值转换为双精度值。

我有 C 语言的代码

double conver_str_to_temp(char *strTemp)
{
    int iTemp;
    double fTemp;

    iTemp = strtoul(strTemp, 0, 16); //strTemp is the string get from the message.
    if (iTemp & 0x8000)         //This means this is a negative value
    {
        iTemp -= 0x10000;
    }

    fTemp = iTemp * 0.0625;

    return fTemp;
}

结果:'00E0'14.000000

结果:'FF6B'-9.312500

但问题是我不擅长 T-SQL。

如何将此 C 代码转换为 T-SQL 函数以在 SQL Server 中使用?

4

3 回答 3

3

没有将包含十六进制值的字符串直接转换为数字的功能。但是您可以使用中间转换为varbinary,然后可以轻松地将其转换为整数。

但是,在转换为 a 时varbinary,您需要指定正确的格式,以便将字符串解释为十六进制值(而不是任意数字和字母的字符串)。这个

CONVERT(varbinary, '00E0')

实际上默认为, 将导致每个字符被单独转换,因为这就是格式说明符的作用。因此,every将被转换为和,这最终会给你——很可能不是你想要的结果。CONVERT(varbinary, '00E0', 0)0'0'0x30'E'0x450x30304530

相比之下,这

CONVERT(varbinary, '00E0', 2)

结果为0x00E0,因为2格式说明符告诉函数将字符串解释为(无前缀)十六进制值。

现在您已经获得了varbinary字符串的正确表示,您可以使用@armen 建议的任何一种方法将值转换为整数:像这样

CONVERT(varbinary, '00E0', 2) * 1

或像这样:

CONVERT(int, CONVERT(varbinary, '00E0', 2))

为了稍微解释前一种方法,它使用隐式转换:因为乘法的另一个操作数1, 是 anint并且int具有比 更高的优先级,所以在乘法发生之前varbinaryvarbinary操作数被隐式转换为int(在这种特殊情况下给出)。224

您可以在手册中阅读有关转换的更多信息。

于 2013-06-29T17:10:17.807 回答
2

尝试这个-:

DECLARE @hex VARCHAR(64) = '00E0'

SELECT CONVERT(VARBINARY, @hex) * 1
-- OR
SELECT CONVERT(INT, CONVERT(VARBINARY, @hex))
于 2013-06-28T07:24:45.393 回答
0

在 TSQL 中,您不需要使用转换函数,SQL Server 会在本质上将 HEX 值转换为整数。

在您的情况下,您可以执行以下操作

declare @hex float
set @hex = 00E0
select @hex
于 2013-06-28T07:27:31.727 回答