我的作业问题〜 我想在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 .. 祝福。
答案 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);