Я предполагаю, что ваш столбец Permissions - Int. Если да, я советую вам поиграть с примером кода, который я приведу ниже. Это должно дать вам четкое представление о том, как работает эта функция.
Declare @Temp Table(Permission Int, PermissionType VarChar(20))
Declare @CanRead Int
Declare @CanWrite Int
Declare @CanModify Int
Select @CanRead = 1, @CanWrite = 2, @CanModify = 4
Insert Into @Temp Values(@CanRead | @CanWrite, 'Read,write')
Insert Into @Temp Values(@CanRead, 'Read')
Insert Into @Temp Values(@CanWrite, 'Write')
Insert Into @Temp Values(@CanModify | @CanWrite, 'Modify, write')
Insert Into @Temp Values(@CanModify, 'Modify')
Select *
From @Temp
Where Permission & (@CanRead | @CanWrite) > 0
Select *
From @Temp
Where Permission & (@CanRead | @CanModify) > 0
Когда вы используете логические и, вы получите число с цифрами 1, соответствующим образом основанными на вашем состоянии. Если ничего не найдено, результат будет 0. Если 1 или более условий совпадают, результат будет больше 0.
Позвольте мне показать вам пример.
Предположим, CanRead = 1, CanWrite = 2 и CanModify = 4. Допустимые комбинации:
Modify Write Read Permissions
------ ----- ---- -----------
0 0 0 Nothing
0 0 1 Read
0 1 0 Write
0 1 1 Read, Write
1 0 0 Modify
1 0 1 Modify, Read
1 1 0 Modify, Write
1 1 1 Modify, Write, Read
Теперь предположим, что вы хотите проверить на чтение или изменение. Из вашего приложения вы могли бы перейти (CanRead | CanModify). Это будет 101 (в двоичном виде).
Во-первых, давайте проверим это по строке в таблице, которую ТОЛЬКО прочитал.
001 (Row from table)
& 101 (Permissions to test)
------
001 (result is greater than 0)
Теперь давайте проверим строку, в которой есть только Write.
010 (Row from table)
& 101 (Permission to test)
------
000 (result = 0)
Теперь проверьте его для строки, которая имеет все 3 разрешения.
111 (Row from table)
& 101 (Permission to test)
------
101 (result is greater than 0)
Надеюсь, вы видите, что если результат операции AND приводит к значению = 0, то ни одно из протестированных разрешений не применяется к этой строке. Если значение больше 0, то присутствует хотя бы одна строка.