我们的 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# 中做这样的事情是个坏主意