如何在存储过程中合并这个`IF ... ELSE`?

时间:2011-06-22 22:40:24

标签: sql-server-2005 tsql stored-procedures

我觉得这个SP可以简化。 是否可以消除IF...ELSE并将其与相同的WHERE条件合并?

CREATE PROC [dbo].[UpdateRmaModelWithTacList](
    @onlyNoModel bit 
)
AS
IF @onlyNoModel=1 
BEGIN
    UPDATE  RMA
    SET       ModelID = COALESCE(modModel.idModel, 1)
    FROM      tabTAC INNER JOIN
                modModel ON tabTAC.fiModel = modModel.idModel RIGHT OUTER JOIN
                 RMA ON tabTAC.TAC = SUBSTRING(RMA.IMEI, 1, 8)
    WHERE     (RMA.ModelID = 1)
END 
ELSE
BEGIN
    UPDATE RMA
    SET      ModelID = COALESCE(modModel.idModel, RMA.ModelID)
    FROM     tabTAC INNER JOIN
              modModel ON tabTAC.fiModel = modModel.idModel RIGHT OUTER JOIN
                RMA ON tabTAC.TAC = SUBSTRING(RMA.IMEI, 1, 8)
END

RETURN @@ROWCOUNT;

Go

1 个答案:

答案 0 :(得分:2)

WHERE (@onlyNoModel != 1 OR RMA.ModelID = 1)

这是否与IF..ELSE版本一样高效,取决于查询优化器。如果WHERE不是1,那么@onlyNoModel将被任何体面的优化器优化掉。