none
如何在存储过程中将if……else 改为case when RRS feed

  • 问题

  • 我创建了一个存储过程,其中@case作为执行update的选择依据,我用if……else已经实现了执行时根据传入的参数执行不同的修改,现在想改用case when来写选择执行的update语句,试了很多种写法都不对,请各位帮帮忙吧!
    下面是我写的if……else的存储过程,请大家教我如何改写成case的形式:
    create proc updateteachercase
    @case int,
    @name nchar(10),
    @age smallint,
    @diqu varchar(50),
    @tel  int
    as
    if(@case=1)
    update student set age=@age where ltrim(name)=@name
    else
    begin
    if(@case=2)
    update student set age=@age,diqu=@diqu where ltrim(name)=@name
    else
    update student set age=@age,diqu=@diqu,lianxidianhua=@tel where ltrim(name)=@name
    end case
    select * from student
    go

    exec updateteachercase 2,'王二小',8,'山区',12221
    执行时因为传入@case=2只会根据名字改变年龄和地区!
    2009年5月20日 15:41

答案

  •  

    create proc updateteachercase
    @case int,
    @name nchar(10),
    @age smallint,
    @diqu varchar(50),
    @tel  int
    as
     
    update student 
    set age=@age,
        diqu = case when @case = 2 then @diqu else diqu end,
        lianxidianhua = case when (@case < 1 or @case > 2) then @tel else lianxidianhua end 
    where ltrim(name)=@name
    
    select * from student
    go
    

    More: blog.csdn.net/happyflystone
    2009年5月21日 2:03

全部回复

  • 根据你的意思 可以这样写
    我只写最重要的那句
    update student
    set age=@age ,
    diqu=case when (@case<>1) then @diqu else diqu end,
    lianxidianhua=case when(@case<>1) then @tel  when(@case<>2) then @tel else lianxidianhua end
    where ltrim(name)=@name
    2009年5月20日 15:57
  • --我创建了一个存储过程,其中@case作为执行update的选择依据,我用if……else已经实现了执行时根据传入的参数执行不同的修改,现在想改用case when来写选择执行的update语句,试了很多种写法都不对,请各位帮帮忙吧!
    --下面是我写的if……else的存储过程,请大家教我如何改写成case的形式:
    
    if exists (select 1 from sysobjects where name = 'Student' and type ='u')
    	drop table Student
    go 
    
    if exists (select 1 from sysobjects where name = 'spUpdateStudent' and type ='p')
    	drop proc spUpdateStudent
    go 
    
    create table Student
    (
    	fName nvarchar(10),
    	fAge  smallint,
    	fDiqu varchar(50),
    	fTel  int
    )
    go
    
    insert into Student values ('X.X.Y', 28, 'Tesing', 888888)
    go
    
    create proc spUpdateStudent
    (
    	@fCase int,
    	@fName nvarchar(10),
    	@fAge smallint,
    	@fDiqu varchar(50),
    	@fTel  int
    )
    as
    	update Student
    		set fAge = @fAge, -- 传 1,2,3 都要更新 fAge 不需要用 case
    			fDiqu = (case when @fCase = 2 or @fCase = 3 then @fDiqu else fDiqu end),
    			fTel  = (case when @fCase = 3 then @fTel else fTel end)
    	where fName = @fName
    	select * from Student
    go
    
    -- 只改 Age
    exec spUpdateStudent
    	@fCase = 1,
    	@fName = N'X.X.Y',
    	@fAge = 80,
    	@fDiqu = N'Update',
    	@fTel  = 1010101
    
    -- 改 Age 和 Diqu
    exec spUpdateStudent
    	@fCase = 2,
    	@fName = N'X.X.Y',
    	@fAge = 80,
    	@fDiqu = N'Update',
    	@fTel  = 1010101
    
    -- 全改
    exec spUpdateStudent
    	@fCase = 3,
    	@fName = N'X.X.Y',
    	@fAge = 80,
    	@fDiqu = N'Update',
    	@fTel  = 1010101

    知识改变命运,奋斗成就人生!
    2009年5月20日 16:11
  • -- case 的用法很多下面是另外一个用法
    declare @fProduct table (Id int, Name nvarchar(10), TypeId int)
    insert @fProduct values (1, '电脑', 1)
    insert @fProduct values (1, '水果', 2)
    insert @fProduct values (1, '汽车', 3)
    
    select 
    	Id, 
    	Name, 
    	(case 
    		when TypeId = 1 then '办公用品'
    		when TypeId = 2 then '食品'
    		when TypeId = 3 then '交通工具'
    		else ''
    	 end)
    from @fProduct

    知识改变命运,奋斗成就人生!
    2009年5月20日 16:18
  •  

    create proc updateteachercase
    @case int,
    @name nchar(10),
    @age smallint,
    @diqu varchar(50),
    @tel  int
    as
     
    update student 
    set age=@age,
        diqu = case when @case = 2 then @diqu else diqu end,
        lianxidianhua = case when (@case < 1 or @case > 2) then @tel else lianxidianhua end 
    where ltrim(name)=@name
    
    select * from student
    go
    

    More: blog.csdn.net/happyflystone
    2009年5月21日 2:03