2

我们的 Sql Server DB 有一些 TSQL 逻辑,可以将大量数据打包成decimal(19,6)一个大varbinary(max)数据 - 它有助于减少 DB 的大小,而不是数千行,我们只有一行。在 TSQL 中,每个decimal(19,6)varbinary(12)通过简单的cast as varbinary(12). 现在,TSQL 使用游标(可能效率低下......)来完成这样的工作,而且速度很慢。我们的 DBA 建议使用 .NET CLR 函数会快得多。

我有使用纯十进制值获取 XML 的 C# 方法。我现在陷入了如何模拟 SQL Server 十进制值的内部表示的问题。

到目前为止,我所拥有的是:

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 的两倍。

十进制是如何存储的,内部表示版本是特定的(因为我没能成功地用谷歌搜索它)?

PS 就个人而言,我认为在 C# 中做这样的事情是个坏主意

4

1 回答 1

1

没能弄清楚。我决定稍微改变一下战术。我把decimalbigint乘以百万。然后除以百万解压。bigint以清晰易懂的方式存储 - 就像在 .NET 中一样。

于 2013-02-15T04:48:55.097 回答