2013-02-11 61 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中一樣。

相關問題