我正在尝试使用If
语句编写过程。
这是我的数据库
我的想法是:当我们拥有相同的ComandmentNumber
时,StudentNumber
必须增加1,但是当我们拥有新的ComandmentNumber
时,StudentNumber
必须从1开始。
示例:
这是我在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'列中;列不允许为空。插入失败。
在第一个条件下,您没有@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
您从不初始化您的@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
或类似的东西,其设计和构建即使在繁重的工作量下也可以提供唯一的值。