有条件插入的存储过程

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

我正试图编写一个带有 If 语句。

这是我的数据库

DataBase

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

例子:下面是我在SQL Server中的存储过程。

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到列'StudentNumber',表'Test.dbo.Defeats-Graduates';列不允许空值。INSERT失败。

sql-server procedure
1个回答
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 - 并加 +1NULL 仍旧 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;

要小心签名: SELECT MAX()+1 办法是 岌岌可危 如果你有一个繁忙的系统,同时有多个客户端在工作和插入数据,那么就会产生重复的值。只要有可能,你应该使用适当的 数据库提供的 机制代替--类似于一个 SEQUENCE 在SQL Server或类似的东西中,设计和构建的,即使在紧张的工作负荷下,也能提供独特的价值。

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