我正试图编写一个带有 If
语句。
这是我的数据库
我的想法是:当我们有相同的 ComandmentNumber
, StudentNumber
必须增加1,但当我们有新的 ComandmentNumber
, StudentNumber
必须从1开始。
例子:下面是我在SQL Server中的存储过程。
下面是我在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失败。
你没有分配语句 @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;
要小心签名: SELECT MAX()+1
办法是 岌岌可危 如果你有一个繁忙的系统,同时有多个客户端在工作和插入数据,那么就会产生重复的值。只要有可能,你应该使用适当的 数据库提供的 机制代替--类似于一个 SEQUENCE
在SQL Server或类似的东西中,设计和构建的,即使在紧张的工作负荷下,也能提供独特的价值。