2

私たちの Sql Server DB には、大量のデータdecimal(19,6)を 1 つの大きなものにパックする TSQL ロジックがいくつかvarbinary(max)あります。これは、1 つの行で何千行もあるのではなく、DB のサイズを縮小するのに役立ちます。TSQL では、それぞれがsimple を介してdecimal(19,6)変換されます。現在、TSQLはカーソル(おそらく非効率的...)を使用してそのようなジョブを実行し、低速です。当社の DBA は、.NET CLR 関数を使用する方がはるかに高速であると提案しています。varbinary(12)cast as varbinary(12)

私はプレーンな 10 進数値で XML を取得する C# メソッドを持っています。SQL Server の 10 進数値の内部表現をどのようにシミュレートできるかという質問に今行き詰まっています。

私がこれまでに持っているものは次のとおりです。

DECLARE @x decimal(19,6) 
SELECT @x = 0
SELECT CAST(@x AS VARBINARY(12))
-- 0x13 06 00 01 00000000

SELECT @x = 1
SELECT CAST(@x AS VARBINARY(12))
--0x13 06 00 01 40420F00

SELECT @x = -1
SELECT CAST(@x AS VARBINARY(12))
--0x13 06 00 00 40420F00

SELECT @x = 1.1
SELECT CAST(@x AS VARBINARY(12))
--0x13 06 00 01 E0C81000

SELECT @x = 2
SELECT CAST(@x AS VARBINARY(12))
--0x13 06 00 01 80841E00

はい、13 - は 19 です

06 - 6 は 19,6 です

00 - ??

00または01は明らかに符号です

AND 80841E00 は 40420F00 の 2 倍です。

10 進数はどのように保存されますか、その内部表現のバージョンは固有ですか (Google でうまく検索できなかったため)?

PS個人的には、C#でそのようなことをするのは悪い考えだと思います

4

1 に答える 1

1

それを理解することができませんでした。少し作戦を変更することにしました。それを100万倍しdecimalて詰め込んでいます。bigintそして、100万に分割して解凍します。bigint.NET と同じように、明確に理解できる方法で格納されます。

于 2013-02-15T04:48:55.097 に答える