1

私にはこんな価値がある

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

この値を double に変換する必要があります。

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 コードを SQL Server で使用する T-SQL 関数に変換するにはどうすればよいですか?

4

3 に答える 3

3

16 進数値を含む文字列を直接数値に変換する関数はありません。ただし、 への中間変換を使用するとvarbinary、簡単に整数に変換できます。

ただし、 に変換する場合varbinaryは、文字列が (任意の数字と文字の文字列ではなく) 16 進数値として解釈されるように、正しい形式を指定する必要があります。これ

CONVERT(varbinary, '00E0')

これは実際には にデフォルト設定されており、すべての文字が個別に変換されます。これは、書式指定子が行うことだからです。したがって、 everyはおよびに変換され、最終的には結果が得られますが、ほとんどの場合、希望する結果にはなりません。CONVERT(varbinary, '00E0', 0)0'0'0x30'E'0x450x30304530

対照的に、これは

CONVERT(varbinary, '00E0', 2)

0x00E0これは、書式指定子が、文字列を (プレフィックスのない) 16 進数値として解釈するように関数に指示するためです2

文字列の正しいvarbinary表現が得られたので、@armen によって提案されたいずれかの方法を使用して、値を整数に変換できます。次のようにします。

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

またはこのように:

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

前者の方法を少し説明すると、暗黙の変換が使用されます。乗算のもう一方のオペランド は であり1intより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 に答える