如何在SQL Server存储过程中进行分支?

时间:2014-06-26 18:20:40

标签: sql-server

我有下表:

CREATE TABLE [dbo].[Test] (
    [TestId]         INT            IDENTITY (1, 1) NOT NULL,
    [TestTypeID]     INT            NOT NULL,
    [ExamId]         INT            NOT NULL,
    [TestStatusId]   INT            NOT NULL,
    [TopicId]        INT            NOT NULL
);

我正在使用我创建的用于插入数据的存储过程:

CREATE PROCEDURE dbo.sp_ins_test   
       @ExamId                          INT            ,
       @TestStatusId                    INT            ,
       @TestTypeId                      INT            ,
       @TopicId                         INT                           
AS 
BEGIN 

如何根据@TestTypeId的值进行不同的操作?

我想要做的是,如果TestTypeId = 1,那么我想更新所有具有TopicId = @TopicId的测试记录,并将TestStatusId更改为2.

如果TestTypeId = 2,那么我想更新所有具有ExamId = @ExamId的测试记录,并将TestStatusId更改为2.

这是我到目前为止所做的:

 UPDATE dbo.Test
 SET    TestStatusId = 2
 WHERE  TestTypeId = @TestTypeId
 AND    Title      = @Title;

 UPDATE dbo.Test
 SET    TestStatusId = 2
 WHERE  ExamId     = @ExamId
 AND    Title      = @Title;

但是我不知道如何根据TestTypeId的值选择一个或其他更新。

2 个答案:

答案 0 :(得分:2)

CREATE PROCEDURE dbo.sp_ins_test   
       @ExamId                          INT            ,
       @TestStatusId                    INT            ,
       @TestTypeId                      INT            ,
       @TopicId                         INT                           
AS 
BEGIN 

 IF @TestTypeID = 1
    BEGIN

     UPDATE dbo.Test
     SET    TestStatusId = 2
     WHERE  TestTypeId = @TestTypeId
     AND    Title      = @Title;
    END

 IF @TestTypeId = 2
    BEGIN

     UPDATE dbo.Test
     SET    TestStatusId = 2
     WHERE  ExamId     = @ExamId
     AND    Title      = @Title;
    END

END

答案 1 :(得分:1)

您可以在SQL中进行分支,并使用IFELSE IF块,但在基于集合的逻辑而不是过程逻辑中进行思考是一个很好的练习。

您可以使用更多WHERE语句来实现此目的。

  update [Test]
  set TestStatusId = 2
  where TopicId = @TopicId
    and TestTypeID = 1

  update [Test]
  set TestStatusId = 2
  where ExamId = @ExamId
    and TestTypeID = 2

你的问题并不完全清楚

  

我想要做的是,如果TestTypeId = 1,那么我想更新   所有具有TopicId = @TopicId的测试记录并更改   TestStatusId为2。

您是指代TestTypeId列还是@TestTypeId参数,但是您省略了@所以我假设您的意思是列。