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