Sql server 带条件插入的存储过程
我试图用Sql server 带条件插入的存储过程,sql-server,procedure,Sql Server,Procedure,我试图用If语句编写一个过程 这是我的数据库 我的想法是:当我们有相同的ComandmentNumber时,StudentNumber必须增加1,但当我们有新的ComandmentNumber时,StudentNumber必须从1开始 例如: 下面是我在SQL Server中的过程 CREATE PROCEDURE InsertIntoDefeatsGraduates @ComandmentNumber VARCHAR(100), @StudentFakNumber INT
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插入“StudentNumber”列中的表“Test.dbo.designs”;列不允许空值。插入失败
你从不初始化你的
@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
方法非常容易产生重复值。只要有可能,您应该使用适当的数据库提供的机制—类似于SQL Server中的序列
,或类似的机制,其设计和构建旨在提供独特的值,即使在繁重的工作负荷下。你也不会初始化你的@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
方法非常容易产生重复值。只要有可能,您应该使用适当的数据库提供的机制—类似于SQL Server中的序列
,或类似的机制,其设计和构建旨在提供独特的值,即使在繁重的工作负荷下。对于@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
的赋值语句。在第一个条件中,您可以尝试以下操作:
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
已经有一个大于0的值。实际上,从dbo中选择@StudentNumber=StudentNumber。[击败毕业生]其中ComandmentNumber=@ComandmentNumber
将初始化@StudentNumber
,如果任何记录匹配。不,在这种情况下,@StudentNumber
已经有一个大于0的值。实际上,从dbo中选择@StudentNumber=StudentNumber。[击败毕业生]其中,如果有任何记录匹配,ComandmentNumber=@ComandmentNumber
将初始化@StudentNumber
。