带条件插入的存储过程

问题描述 投票:1回答:2

我正在尝试使用If语句编写过程。

这是我的数据库

DataBase

我的想法是:当我们拥有相同的ComandmentNumber时,StudentNumber必须增加1,但是当我们拥有新的ComandmentNumber时,StudentNumber必须从1开始。

示例:

enter image description here

这是我在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

但是当我尝试执行此操作时,出现此错误:

无法将值NULL插入表'Test.dbo.Defeats-Graduates'的'StudentNumber'列中;列不允许为空。插入失败。

sql-server procedure
2个回答
1
投票

在第一个条件下,您没有@StudentNumber的赋值语句,您可以尝试以下操作:

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

3
投票

您从不初始化您的@StudentNumber-您只需声明它-然后为NULL-并且将+1添加到NULL仍然为NULL-因此,最后,您尝试将NULL插入表格中

-- at this point, @StudentNumber is NULL 
DECLARE @StudentNumber INT 

IF EXISTS (SELECT * FROM dbo.[Defeats-Graduates] 
           WHERE ComandmentNumber = @ComandmentNumber) 
BEGIN
    -- trying to increment a NULL value still results in NULL
    SET @StudentNumber += 1

    -- here you're about to insert NULL into "StudentNumber"
    INSERT INTO dbo.[Defeats-Graduates] (ComandmentNumber, StudentNumber, StudentFakNumber) 
    VALUES (@ComandmentNumber, @StudentNumber, @StudentFakNumber)

如果存在,您需要做的是读取实际值

IF EXISTS (SELECT * FROM dbo.[Defeats-Graduates] 
           WHERE ComandmentNumber = @ComandmentNumber) 
BEGIN
    -- get the highest value and increment by one
    SELECT @StudentNumber = MAX(StudentNumber) + 1
    FROM dbo.[Defeats-Graduates] 
    WHERE ComandmentNumber = @ComandmentNumber;

BE AWARE:如果您有一个繁忙的系统且有多个客户端同时工作并插入数据,则SELECT MAX()+1方法很容易产生重复的值。只要有可能,就应该使用适当的database-provided机制-类似于SQL Server中的SEQUENCE或类似的东西,其设计和构建即使在繁重的工作量下也可以提供唯一的值。

© www.soinside.com 2019 - 2024. All rights reserved.