3
我正在尋找在SQL Server中實現128位無符號整數的最佳方法。主要要求是它必須必須支持所有128位的按位操作。 (這是甚至理論上可能在64位機器上?我離題了。)SQL Server 2012中的128位Int?
我讀過一些使用C#和用戶定義的類型通過CLR程序集的實現,但我無法確定它是否支持按位操作。
有沒有人成功地做了我需要做的事情?任何投入將不勝感激。謝謝!!
我正在尋找在SQL Server中實現128位無符號整數的最佳方法。主要要求是它必須必須支持所有128位的按位操作。 (這是甚至理論上可能在64位機器上?我離題了。)SQL Server 2012中的128位Int?
我讀過一些使用C#和用戶定義的類型通過CLR程序集的實現,但我無法確定它是否支持按位操作。
有沒有人成功地做了我需要做的事情?任何投入將不勝感激。謝謝!!
數據庫端,我會用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',所以不能直接在第四個字節之後進行按位操作(如果'bigint'也有效,則超出第8個字節) – 2014-10-10 11:33:48
@MartinSmith哦,是的,誤讀了謝謝。 – weston 2014-10-10 12:22:30
這是一個有趣的方法。我會試一試。你能舉一個例子說明如何在SQL中聲明和使用My128BitValue變量(在CLR實現後)? – cody 2014-10-10 17:14:26