Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 带条件插入的存储过程_Sql Server_Procedure - Fatal编程技术网

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