2014-12-18 1 views
0

Следующая хранимая процедура устанавливает бит определенного бита в битовый массив флагов. Есть ли способ сделать это без IF?Установите бит бит с побитовым оператором

ALTER PROCEDURE [dbo].[SETFlag] 
    @CMCONID int, @FlagID int, @FlagValue bit 
AS 
BEGIN 
SET NOCOUNT ON; 

    IF @FlagValue = 0 
     Update CMContracts 
     SET Conditions = Conditions & ((POWER(2,30)-1)^POWER(2,@FlagID)) 
     Where ID = @CMCONID 
    ELSE IF @FlagValue = 1 
     Update CMContracts 
     SET Conditions = Conditions | POWER(2,@FlagID) 
     Where ID = @CMCONID 
END 
+1

Это может быть решенным дизайн по какой-то причине, но, как правило, несмотря на «аккуратности» или «компактности» конструкции битового поля, то лучше, чтобы расширить вне данных и моделировать его реляционно. То есть с текущим дизайном, нет реального способа извлечь выгоду из, например, индексы, если вам нужно * query * в отношении данных этого битового поля. –

ответ

0

Вы можете сделать это с IIF вместо этого, но им не уверен, что есть большая разница, за исключением требуя, чтобы повторить остальную часть UPDATE запроса.

Update CMContracts 
SET Conditions = IIF(@FlagValue = 1, 
         Conditions | POWER(2,@FlagID), -- true 
         Conditions & ((POWER(2,30)-1)^POWER(2,@FlagID)) -- false 
        ) 
Where ID = @CMCONID 
0

Yep:

Update CMContracts 
    SET Conditions = CASE WHEN @FlagValue = 0 THEN Conditions & ((POWER(2,30)-1)^POWER(2,@FlagID)) 
        CASE WHEN @FlagValue = 1 THEN Conditions | POWER(2,@FlagID) 
Where ID = @CMCONID 

Я может ответить на ваш вопрос слишком буквально - возможно, ваш вопрос о том, может ли объединить две ветви в одном выражении с операторами поразрядными без CASE. Боюсь, у меня недостаточно опыта с побитовыми функциями, чтобы ответить на это.

0

Использование Case Statement для имитации IF - Else заявление

UPDATE CMContracts 
    SET Conditions = CASE 
         WHEN @FlagValue = 0 THEN Conditions & ((Power(2, 30) - 1)^Power(2, @FlagID)) 
         WHEN @FlagValue = 1 THEN Conditions | Power(2, @FlagID) 
         END 
    WHERE ID = @CMCONID 
Смежные вопросы