我们的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#中做这样的事情是个坏主意。
答案 0 :(得分:1)
没有设法解决这个问题。我决定稍微改变战术。我将decimal
打包到bigint
,将其乘以百万。然后拆分为百万。 bigint
以清晰易懂的方式存储 - 就像在.NET中一样。