2014-10-10 7 views
3

Я ищу лучший способ реализовать 128-битные целые числа без знака в SQL Server. Основным требованием является то, что он должен поддерживать побитовые операции по всем 128 бит. (Возможно, это теоретически возможно на 64-битной машине?).128 бит Int в SQL Server 2012?

Я читал о некоторых реализациях с использованием C# и определяемых пользователем типов через сборку CLR, но я не мог определить, поддерживает ли это поразрядное операции.

Кто-нибудь успешно сделал то, что мне нужно сделать? Любой вход был бы весьма признателен. Благодаря!!

ответ

4

База данных, я бы использовал столбец 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

+0

Не совсем "не беспокоить". Один из операндов должен быть 'int', поэтому не нужно делать побитовые операции за четвертым байтом (или за пределами 8-го байта, если также работает bigint) –

+0

@MartinSmith, о, да, неправильно прочитайте это. – weston

+0

Это интересный подход. Я дам ему попробовать. Можете ли вы привести пример того, как переменная My128BitValue будет объявлена ​​и использована в SQL (после реализации CLR)? – cody

 Смежные вопросы

  • Нет связанных вопросов^_^