SQL Server十进制到varbinary的算法模拟

时间:2013-02-11 13:02:32

标签: .net sql-server casting decimal varbinary

我们的Sql Server数据库有一些TSQL逻辑,将{strong>吨的decimal(19,6)打包成一个大varbinary(max) - 它有助于减少数据库的大小,而不是我们拥有的数千行一排。在TSQL中,每个decimal(19,6)都会通过简单varbinary(12)转换为cast as varbinary(12)。现在,TSQL使用游标(可能效率低下......)来做这样的工作而且速度很慢。我们的DBA建议使用.NET CLR功能会更快。

我有C#方法,它使用普通的十进制值获取XML。我现在被问到如何模拟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大两倍。

如何存储十进制,是特定的内部表示版本(因为我没有设法成功谷歌它)?

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

1 个答案:

答案 0 :(得分:1)

没有设法解决这个问题。我决定稍微改变战术。我将decimal打包到bigint,将其乘以百万。然后拆分为百万。 bigint以清晰易懂的方式存储 - 就像在.NET中一样。