在tsql中将varbinary转换为数字类型

本文关键字:数字 类型 转换 varbinary tsql 中将 | 更新日期: 2023-09-27 18:20:12

我们目前正在处理一个遗留应用程序,其中c#中的十进制数以varbinary类型存储在数据库(sqlserver)中。这样做(我认为)是为了保持数字格式。

现在的问题是,我们无法对数据库中的数字进行搜索/索引。它必须在应用程序中恢复为c#小数,然后这才有意义。

如何在sqlserver中将varbinary转换为十进制/数字类型?

我不介意创建一个新的列/表来存储从varbinary派生的数值和格式信息。

我知道在c中,你可以通过给它一个int数组来创建一个十进制数。

以下是c#如何解释int数组并将其转换为十进制类型的描述。http://msdn.microsoft.com/en-us/library/aa326746(v=vs.71).aspx

十进制数的二进制表示由一个1位符号、一个96位整数和一个比例因子组成,该比例因子用于划分整数并指定整数的哪一部分是十进制分数。比例因子隐含地是数字10,提升到0到28范围内的指数。bits是一个由32位有符号整数组成的四元素长数组。比特[0]、比特1和比特[2]包含96比特整数的低、中和高32比特。bits[3]包含比例因子和符号,并由以下部分组成:低位字0到15位未使用,必须为零。位16到23必须包含一个介于0和28之间的指数,该指数表示10的幂除以整数。第24位至第30位未使用,必须为零。位31包含符号;0表示正,1表示负。一个数值可能有几种可能的二进制表示形式;所有这些都是同等有效的,并且在数字上是等效的。请注意,比特表示在负零和正零之间进行区分。这些值在所有操作中都被视为相等。

我们非常感谢您的帮助。

这是一些样本数据

Name        DecimalValue            NumericValue
-----------------------------------------------------------------------------
Number2_4   0x14E20100000000000000000000000200      1234.12
Number1     0xCF040000000000000000000000000100      123.1
Number5     0xD9299549000000000000000000000500      12345.12345
Number4     0xF24FBC00000000000000000000000400      1234.1234

用于在类型之间转换的C#代码

====================================

byte[] GetBytes ( decimal? value )
    {
        if ( value == null )
        {
            return null;
        }
        byte[] bytes = new byte[16];
        int[] bits = Decimal.GetBits ( (decimal) value );
        Array.Copy ( BitConverter.GetBytes ( bits[0] ), 0, bytes, 0, 4 );
        Array.Copy ( BitConverter.GetBytes ( bits[1] ), 0, bytes, 4, 4 );
        Array.Copy ( BitConverter.GetBytes ( bits[2] ), 0, bytes, 8, 4 );
        Array.Copy ( BitConverter.GetBytes ( bits[3] ), 0, bytes, 12, 4 );
        return bytes;
    }
    decimal? ToDecimal ( byte[] value )
    {
        if ( value == null )
        {
            return null;
        }
        int[] bits = { BitConverter.ToInt32 ( value, 0 ), BitConverter.ToInt32 ( value, 4 ), BitConverter.ToInt32 ( value, 8 ), BitConverter.ToInt32 ( value, 12 ) };
        return new decimal ( bits );
    }

在tsql中将varbinary转换为数字类型

这个问题由Lamprey解决!在sqlteam论坛上。访问查看答案

http://www.sqlteam.com/forums/topic.asp?TOPIC_ID=186457