【问题标题】:TSQL vbinary bitmasking with varbinary right hand side operator使用 varbinary 右侧运算符的 T SQL varbinary 位掩码
【发布时间】:2012-02-16 15:20:35
【问题描述】:

我正在为我面临的这个设计挑战寻找一些提示或技巧:

我需要对存储在数据库中的两个相同大小的 varbinary 字段进行位掩码。只是为了澄清,不,这不是“权限表”或任何东西。我会为这些类型的项目规范化数据库,而这些数据无法规范化。我正在存储一个 varbinary 字段,用于动态存储我们的应用程序生成的位。我也在用另一个 varbinary 查询来搜索这些位。在 .net 中,我使用 BigInteger 类型来处理所有位掩码,它做得很好,但是我正在考虑将此过程卸载到数据库服务器以过滤结果,然后再将其传递回调用者。现在,我最多支持 varbinary(512) 字段类型,并且希望同时执行 AND 和 OR 运算符,并且能够比较右侧运算符中的位的 ANY (OR) 或 ALL (AND) 是否成功通过。 MSDN 说您可以将 varbinary() 与右侧运算符 max bigint 一起使用,但我需要超出此范围。

我发现的一个很好的资源是 Adam Machanic 的关于该主题的博客文章,但在深入研究之前先看看是否有其他方法。

http://sqlblog.com/blogs/adam_machanic/archive/2006/07/12/bitmask-handling-part-3-logical-operators.aspx

这适用于 SQL 2005 或更高版本。如果 2008 年有一个 2005 年没有的功能,我会很好,只是我还没有找到一个。

非常感谢任何提示或技巧。

谢谢。

特拉维斯·惠登

【问题讨论】:

  • 我仍然对这个答案很好奇,但现在我在 SQL 中创建了一个 CLR 函数来执行我想要测试的位掩码操作。
  • 将位掩码存储在 SQL Server 中作为您要过滤的字段并不是最好的设计,因为它是无法索引的搜索。 (因此每次搜索都要进行表扫描)。就我个人而言,我会将匹配卸载到应用程序服务器,并使用数据库服务器进行查询管理器可以优化的查询。
  • 如果 BigInt 在 .NET 中工作,那么为什么 BigInt 在 SQL 中不够大。
  • 从我在 SQL Server 中使用位掩码的经验来看,SQL 没有很好的处理方法,性能总是很差。如果您绝对必须检查位掩码,则最好使用您创建的简单 CLR 函数,但您永远无法有效地搜索位掩码,因为正如 Filip 所说,它无法被索引。
  • 是的,我最终为它做了一个 CLR 类型。它实际上非常快并且可以接受。

标签: sql-server tsql bit-manipulation bitwise-operators varbinary


【解决方案1】:

如果您知道位图的最大长度,您可以将它分布在多个列上并单独屏蔽它们。

不过很快就会变得一团糟。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 2012-06-07
    • 2012-08-26
    相关资源
    最近更新 更多