使用按位运算符设置位标志

时间:2014-12-18 12:11:45

标签: sql-server tsql bit-manipulation

以下存储过程在标志位数组中设置特定位标志。 有什么办法可以用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

3 个答案:

答案 0 :(得分: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 

答案 1 :(得分:0)

是的:

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的按位运算符的表达式。我担心我没有足够的按位函数经验来回答这个问题。

答案 2 :(得分: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