SQL Server 2012中的128位整数?

5
我在寻找在SQL Server中实现128位无符号整数的最佳方法。主要要求是它必须支持所有128位的按位操作。(在64位机器上这甚至在理论上可行吗?我离题了。)
我已经阅读了一些使用C#和用户定义类型通过CLR程序集的实现,但我无法确定它是否支持按位操作。
有人成功地做过我需要做的事情吗?任何意见都将不胜感激。谢谢!

1
我意识到这个问题已经存在了将近5年了;然而,“理论上64位机器可以实现”的答案是-当然可以。在大多数处理器上,您可以执行移位和/或算术运算“带进位”。例如,在具有此功能的8位处理器上(即使是Commodore 64使用的6502),任何溢出都会进入一个“进位”位,该位可以计算下一个字节的操作。因此,即使在8位体系结构中也可以进行128位算术运算,尽管几乎完全是通过汇编语言实现的(大多数高级语言对进位位一无所知)。 - JackLThornton
1个回答

9

数据库方面,我会使用一个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的基本示例,你需要完成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
    }
}

你可以在SQL中对两个列运行bitwiseAnd128Bit

了解更多关于CLR的信息,请参阅http://msdn.microsoft.com/en-us/library/w2kae45k(v=vs.90).aspx


并不是“没有问题”。其中一个操作数必须是“int”,因此进行第四个字节(或第8个字节,如果“bigint”也适用)以外的位运算并不直接。 - Martin Smith
这是一个有趣的方法。我会尝试一下。你能举个例子说明在 SQL 中如何声明和使用 My128BitValue 变量(在 CLR 实现之后)吗? - vimfluencer
@ambient 添加了示例。 - weston
Weston - 我终于回来处理这个问题了。这个解决方案很棒,而且实现起来非常简单。我觉得这实际上是一个非常优雅和创造性的解决方案。谢谢! - vimfluencer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接