Sql 带varbinary列的按位AND运算符

Sql 带varbinary列的按位AND运算符,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,使用SQL Server 2008,我有一个varbinary32列,最多可表示256个属性。我需要能够识别未选择特定属性的位置 例如,属性15存储为 0x0080000000000000000000000000000000000000000000000000000000000000 属性14和15存储为 0x00C0000000000000000000000000000000000000000000000000000000000000 所以知道0x00C000。。。如果属性为15,我想我可

使用SQL Server 2008,我有一个varbinary32列,最多可表示256个属性。我需要能够识别未选择特定属性的位置

例如,属性15存储为

0x0080000000000000000000000000000000000000000000000000000000000000
属性14和15存储为

0x00C0000000000000000000000000000000000000000000000000000000000000
所以知道0x00C000。。。如果属性为15,我想我可以使用按位AND运算符进行查询,以返回属性为15的所有行:

select * from table where varbinaryCol & 32768 > 0
但这将返回0行。该表至少有一行启用了属性14和15,至少有一行仅启用了属性15。我希望该查询至少返回2行

我错过了什么

编辑

下面是不同位翻转的列值的进一步示例:

0:
0x0100000000000000000000000000000000000000000000000000000000000000

32:
0x0000000001000000000000000000000000000000000000000000000000000000

64:
0x0000000000000000010000000000000000000000000000000000000000000000

96:
0x0000000000000000000000000100000000000000000000000000000000000000

因此,在这个64字节的十六进制字符串中似乎存储了8个单独的十六进制值?

是的,32768=2^15,但是在二进制中,这是第16个标志,因为2^0=1

我还建议您使用tsql中的幂函数来表示这些数字,这样后面的人就不必进行二进制翻译

SELECT POWER(2,15); -- 32768
你试过了吗?我想你可能有一个操作顺序问题

select * 
from table 
where (varbinaryCol & 32768) > 0

这里的问题是类型是varbinary,而不是int

在SQL Server中,如果不使用两个varbinary值,其中一个值必须是int或smallint,tinyint,bit

您必须使用SUBSTRING将长varbinary拆分为4字节块,然后使用int-bitmask应用逐位运算符

或者,您可以编写使用两个varbinary值的CLR函数

除此之外,您还需要注意二进制值的存储方式。32768位掩码值的最大值是多少

看起来您的varbinary值使用的endianness与SQL Server使用的endianness不同。很容易看到:

SELECT cast(32768 as binary(32))
返回

0x0000000000000000000000000000000000000000000000000000000000008000
那么,您的varbinaryCol&32768比较


不久前我回答了类似的问题——也许这对你有帮助?可能是@Hogan的重复,重复的问题不一样。这里的问题是类型是varbinary,而不是int。在SQL Server中,不要使用两个varbinary值,其中一个必须是int。您必须使用子字符串将长varbinary拆分为4字节块,然后应用位运算符。或者编写与varbinary一起工作的CLR函数。谢谢您的建议。我试过了,也得到了同样的结果。谢谢你的推荐。我确实意识到2^0=1,在这个系统中,它被识别为属性0。因此,不带属性的行将此列设置为0x00000000000000000000000000000000000000000000000000000您知道启用了15的行吗?如果是这样的话,使用id或其他什么将select过滤器设置为这两行,并且在select中还返回varbinaryCol&32768的结果,并查看它是什么。您可以从那里进行故障排除。我遵循了您的建议,但奇怪的是,varbinaryCol&32768是0。这正是我所期望的。现在帮我一个忙,看看varbinaryCol&16384是什么。请将为varbinaryCol返回的值粘贴在这里,以及您认为为该列设置了哪些标志。我正试图理解我在你的截图中看到的价值。在我看来,这真的不对。在我看来,你好像有23面旗帜。我还认为您只需要一个varbinary4来保存256个标志的可能值,而不是一个varbinary32。
0x0080000000000000000000000000000000000000000000000000000000000000
with
0x0000000000000000000000000000000000000000000000000000000000008000