如何使用案例在存储过程中执行不同的SQL

时间:2014-02-18 16:24:31

标签: sql sql-server

我的作业问题〜 我想在proc中执行不同的sql以使用CASE WHEN 和像这样的代码

CREATE  proc [dbo].[removeFileNew] (@transerid int,@Type int)  
as   
--PRINT @file
--PRINT @transerid


CASE  
    WHEN @Type=1 --report
    THEN 
        UPDATE order_report_path SET ReportPath=''
        WHERE tran_ser_id=@transerid

     WHEN @Type=2--gl

        UPDATE order_report_path SET GRpath=''
        WHERE tran_ser_id=@transerid

    WHEN @Type=3--ic
        UPDATE order_report_path SET ICpath=''
        WHERE tran_ser_id=@transerid

END

但它有一些错误,例如'关键字'CASE'附近的语法不正确 如果在c ++中使用,我怎么能使用这个案例。 thx all .. 祝福。

3 个答案:

答案 0 :(得分:3)

你不能像这样使用CASE。在SQL中,这意味着返回一个值,而不是控制流。

改为使用IF语句。

IF @Type=1 --report
BEGIN 
    UPDATE order_report_path SET ReportPath=''
    WHERE tran_ser_id=@transerid
END
ELSE IF @Type=2 --gl
BEGIN
    UPDATE order_report_path SET GRpath=''
    WHERE tran_ser_id=@transerid
END
ELSE IF @Type=3 --ic
BEGIN
    UPDATE order_report_path SET ICpath=''
    WHERE tran_ser_id=@transerid
END

请注意,BEGIN / END语句是可选的,只要每个块只有一条指令,但我仍然建议您保留它们。

同样适用于ELSE:在这种情况下不是很有用,但如果你的表达式更复杂和/或如果需要,你必须确保只执行一个块。

答案 1 :(得分:2)

IF @Type = 1
  BEGIN
    UPDATE order_report_path
    SET    ReportPath = ''
    WHERE  tran_ser_id = @transerid
  END
ELSE IF @Type = 2
  BEGIN
    UPDATE order_report_path
    SET    GRpath = ''
    WHERE  tran_ser_id = @transerid
  END
ELSE IF @Type = 3
  BEGIN
    UPDATE order_report_path
    SET    ICpath = ''
    WHERE  tran_ser_id = @transerid
  END

答案 2 :(得分:1)

您可以通过将case置于更新中来在单个查询中执行此操作:

    UPDATE order_report_path
        SET ReportPath = (case when @Type = 1 then '' else ReportPath end),
            GRpath = (case when @Type = 2 then '' else GRPath end),
            ICpath = (case when @Type = 3 then '' else ICpath end)
    WHERE tran_ser_id = @transerid
    AND @Type in (1, 2, 3);