C# 在SQL Server中反汇编位标志枚举
我在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的行 有人知道这样一种聪明的方法来分解数字吗
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,超级解释