Search code examples
sql-serverprocedure

Stored procedure with conditional insert


I am trying to write a procedure with an If statement.

This is my database

DataBase

My idea is: when we have same ComandmentNumber, StudentNumber must increase by 1, but when we have new ComandmentNumber, StudentNumber must start from 1.

Example:

enter image description here

Here is my procedure in SQL Server

CREATE PROCEDURE InsertIntoDefeatsGraduates
    @ComandmentNumber VARCHAR(100),
    @StudentFakNumber INT
AS
BEGIN
    DECLARE @StudentNumber INT 

    IF EXISTS (SELECT * FROM dbo.[Defeats-Graduates] 
               WHERE ComandmentNumber = @ComandmentNumber) 
    BEGIN
        SET @StudentNumber += 1

        INSERT INTO dbo.[Defeats-Graduates] (ComandmentNumber, StudentNumber, StudentFakNumber) 
        VALUES (@ComandmentNumber, @StudentNumber, @StudentFakNumber)
    END
    ELSE
    BEGIN
        SET @StudentNumber = 1

        INSERT INTO dbo.[Defeats-Graduates](ComandmentNumber, StudentNumber, StudentFakNumber) 
        VALUES (@ComandmentNumber, @StudentNumber, @StudentFakNumber)
    END
END

But when I try to execute this, I get this error:

Cannot insert the value NULL into column 'StudentNumber', table 'Test.dbo.Defeats-Graduates'; column does not allow nulls. INSERT fails.


Solution

  • You have no assignment statements for @StudentNumber in the first condition, You can try this:

    CREATE PROCEDURE InsertIntoDefeatsGraduates
        @ComandmentNumber VARCHAR(100),
        @StudentFakNumber INT
    AS
    BEGIN
        DECLARE @StudentNumber INT 
        SELECT @StudentNumber = StudentNumber  FROM dbo.[Defeats-Graduates] 
                   WHERE ComandmentNumber = @ComandmentNumber
        IF ISNULL(@StudentNumber, 0) > 0
          BEGIN
            SET @StudentNumber += 1
    
            INSERT INTO dbo.[Defeats-Graduates] (ComandmentNumber, StudentNumber, StudentFakNumber) 
            VALUES (@ComandmentNumber, @StudentNumber, @StudentFakNumber)
          END
        ELSE
          BEGIN
            SET @StudentNumber = 1
    
            INSERT INTO dbo.[Defeats-Graduates](ComandmentNumber, StudentNumber, StudentFakNumber) 
            VALUES (@ComandmentNumber, @StudentNumber, @StudentFakNumber)
          END
        END