База данных, я бы использовал столбец 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
Не совсем "не беспокоить". Один из операндов должен быть 'int', поэтому не нужно делать побитовые операции за четвертым байтом (или за пределами 8-го байта, если также работает bigint) –
@MartinSmith, о, да, неправильно прочитайте это. – weston
Это интересный подход. Я дам ему попробовать. Можете ли вы привести пример того, как переменная My128BitValue будет объявлена и использована в SQL (после реализации CLR)? – cody