我正在寻找在SQL Server中实现128位无符号整数的最佳方法。主要要求是必须支持所有128位的按位运算。 (这在理论上甚至可以在64位机器上使用吗?我离题了。)
我已经通过CLR程序集阅读了一些使用C#和用户定义类型的实现,但我无法确定它是否支持按位运算。
有没有人成功完成了我需要做的事情?任何投入将不胜感激。谢谢!
答案 0 :(得分: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);
}
}
这里的CLR基本示例,您需要完成FromByteArray
和ToByteArray
方法:
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
}
}
然后,您可以在SQL中的两列上运行bitwiseAnd128Bit
。
在此处了解有关CLR的更多信息http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.90).aspx