SQL Server 2012中的128位Int?

amb*_*ent 4 c# sql-server int bit-manipulation 128-bit

我正在寻找在SQL Server中实现128位无符号整数的最佳方法.主要要求是它必须支持所有128位的按位运算.(这在理论上甚至可以在64位机器上使用吗?我离题了.)

我已经阅读了一些通过CLR程序集使用C#和用户定义类型的实现,但我无法确定它是否支持按位运算.

有没有人成功完成我需要做的事情?任何投入将不胜感激.谢谢!!

wes*_*ton 6

数据库方面,我使用了一个binary[16]列.

然后在clr代码中,您可以重载自定义类型中的按位运算符:

public struct My128BitValue
{
    private readonly long _l1;
    private readonly long _l2;

    public My128BitValue(long l1, long l2)
    {
        _l1 = l1;
        _l2 = l2;
    }

    public static My128BitValue operator &(My128BitValue left, My128BitValue right)
    {
        return new My128BitValue(left._l1 & right._l1, left._l2 & right._l2);
    }

    public static My128BitValue operator |(My128BitValue left, My128BitValue right)
    {
        return new My128BitValue(left._l1 | right._l1, left._l2 | right._l2);
    }

    public static My128BitValue operator ^(My128BitValue left, My128BitValue right)
    {
        return new My128BitValue(left._l1 ^ right._l1, left._l2 ^ right._l2);
    }
}
Run Code Online (Sandbox Code Playgroud)

CLR基本示例在这里,您需要完成FromByteArrayToByteArray方法:

using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

public partial class UserDefinedFunctions
{    
    [SqlFunction()]
    public static SqlBinary bitwiseAnd128Bit(SqlBinary lhs, SqlBinary rhs)
    {
        My128BitValue v1 = My128BitValue.FromByteArray((byte[])lhs); //explicit conversion
        My128BitValue v2 = My128BitValue.FromByteArray((byte[])rhs);
        My128BitValue result = v1 & v2;
        return result.ToByteArray(); //implicit conversion
    }
}
Run Code Online (Sandbox Code Playgroud)

从SQL开始,您可以bitwiseAnd128Bit在两列上运行.

有关CLR的更多信息,请访问http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.90).aspx