在SQL Server上的SQL存储过程中的情况

roc*_*cky 14 sql-server

基于参数我想在我的存储过程中执行不同的更新.我尝试了下面代码的许多排列,但我总是有错误.

    @EmpID int = 0, 
@NewStatus nvarchar(10) = 0
AS
BEGIN
SET NOCOUNT ON;

select CASE   @NewStatus 

when    'InOffice' then 
     Update tblEmployee set InOffice = -1 where EmpID = @EmpID
when   'OutOffice' then 
    Update tblEmployee set InOffice = -1 where EmpID = @EmpID
when 'Home' then 
    Update tblEmployee set Home = -1 where EmpID = @EmpID

END
Run Code Online (Sandbox Code Playgroud)

rs.*_*rs. 25

试试这个

If @NewStatus  = 'InOffice' 
BEGIN
     Update tblEmployee set InOffice = -1 where EmpID = @EmpID
END
Else If @NewStatus  = 'OutOffice'
BEGIN
    Update tblEmployee set InOffice = -1 where EmpID = @EmpID
END
Else If @NewStatus  = 'Home'
BEGIN
    Update tblEmployee set Home = -1 where EmpID = @EmpID
END
Run Code Online (Sandbox Code Playgroud)

  • 我猜测是因为你的语法包括THEN - 这是无效的T_SQL http://msdn.microsoft.com/en-us/library/ms182717.aspx (7认同)
  • 有另一个upvote!你的回答对我有帮助.如果不明显,人们应该真正发布为什么他们会投票. (4认同)
  • 谁下来投票给我请发布你的理由,这个答案没有语法错误或任何错误. (3认同)

Mic*_*son 18

CASE不用于流量控制...为此,你需要使用IF...

但是,有一个基于集合的解决方案来解决这个问题,而不是程序方法:

UPDATE tblEmployee
SET 
  InOffice = CASE WHEN @NewStatus = 'InOffice' THEN -1 ELSE InOffice END,
  OutOffice = CASE WHEN @NewStatus = 'OutOffice' THEN -1 ELSE OutOffice END,
  Home = CASE WHEN @NewStatus = 'Home' THEN -1 ELSE Home END
WHERE EmpID = @EmpID
Run Code Online (Sandbox Code Playgroud)

请注意,ELSE如果@NewStatus不满足条件,则将保留原始值.