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

.net SQL Server十进制到varbinary的模拟算法,.net,sql-server,casting,decimal,varbinary,.net,Sql Server,Casting,Decimal,Varbinary,我们的Sql Server DB有一些TSQL逻辑,它将十进制(19,6)的吨打包成一个大varbinary(max)——它有助于减少DB的大小,而不是数千行,我们只有一行。在TSQL中,每个十进制(19,6)通过简单转换为varbinary(12)转换为varbinary(12)。现在,TSQL使用游标(可能效率很低…)来完成这样的工作,而且速度很慢。我们的DBA建议使用.NET CLR函数会快得多 我有一个C#方法,它可以获取带有纯十进制值的XML。我现在被一个问题困住了:如何模拟十进制值的

我们的Sql Server DB有一些TSQL逻辑,它将
十进制(19,6)
打包成一个大
varbinary(max)
——它有助于减少DB的大小,而不是数千行,我们只有一行。在TSQL中,每个
十进制(19,6)
通过简单
转换为varbinary(12)
转换为
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是明显的标志

80841E00比40420F00大两倍

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


另外,就我个人而言,我认为在C#

中做这样的事情是个坏主意,但我没有设法弄明白。我决定改变一下战术。我将十进制数乘以百万,将其压缩为bigint。然后除以百万来解包
bigint
以清晰易懂的方式存储—就像.NET中一样