C# 在SQL Server中反汇编位标志枚举

C# 在SQL Server中反汇编位标志枚举,c#,.net,sql-server,sql-server-2008,C#,.net,Sql Server,Sql Server 2008,我在SQL Server数据库中有一个INT列,它存储与位标志枚举相关的值。例如,如果枚举为: [Flags()] public enum UserType { StandardUser = 1, Admin = 2, SuperUser = 4 } SQL Server中的列可能包含值5 我需要做的是从另一个表中选择所有的行,该表包含关于UserType的其他详细信息,因此使用值为5的示例,我希望从第二个表中选择ID为1和4的行 有人知道这样一种聪明的方法来分解数字吗

我在SQL Server数据库中有一个
INT
列,它存储与位标志枚举相关的值。例如,如果枚举为:

[Flags()]
public enum UserType
{
    StandardUser = 1,
    Admin = 2,
    SuperUser = 4
}
SQL Server中的列可能包含值5

我需要做的是从另一个表中选择所有的行,该表包含关于
UserType
的其他详细信息,因此使用值为5的示例,我希望从第二个表中选择ID为1和4的行

有人知道这样一种聪明的方法来分解数字吗?理想情况下,该方法应该在某种程度上是递归的,因为这是一个非常简单的示例,实际的表/枚举要大得多。

SELECT*FROM first\u table f
SELECT * FROM first_table f 
  JOIN second_table s ON s.ID & f.Flags <> 0 
  WHERE f.something = something
在s.ID和f.标志0上连接第二个_表 其中f.某物=某物

这将从第二个_表中选择与第一个表中给定行上的任何标志匹配的所有行。

要获取设置为1和设置为4的所有行,请

SELECT * FROM UserTable
WHERE userType & 5 = 5
SELECT * FROM UserTable
WHERE userType & 5 <> 0

要获取设置了1或4中至少一个的所有行

SELECT * FROM UserTable
WHERE userType & 5 = 5
SELECT * FROM UserTable
WHERE userType & 5 <> 0
其中PermissionSets包含标志,用户必须有一个标志集:

SELECT UserTable.*
FROM UserTable JOIN PermissionSets
ON UserTable.userType & PermissionSets.userType <> 0
WHERE PermissionSets.id = 42
为id为93的用户关闭
超级用户

UPDATE UserTable
SET userType = userType | 4
WHERE id = 93
UPDATE UserTable
SET userType = userType & ~4
WHERE id = 93
从用于从C#处理此问题的ADO.NET(或其他)代码中,我们可以将转换为int的相关
UserType
值传递到参数中,而不是显式发送
4
5


编辑:另请参见,

谢谢Jon,超级解释