2013-02-11 59 views
2

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

我有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 

OK, 13 - 19

06 - 6这是19,6

00 - ??

00或01的标志显然

和80841E00比40420F00的两倍大。

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

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

回答

1

没有设法弄清楚。我决定改变战术。我打包decimalbigint乘以百万。然后解压缩至百万。 bigint以清晰易懂的方式存储 - 就像在.NET中一样。

相关问题