Sql server 存储过程表示行受影响,但未提交任何内容

Sql server 存储过程表示行受影响,但未提交任何内容,sql-server,Sql Server,我正在创建一个存储过程,在其中输入一名员工和一名经理。如果经理不在employee表中,我需要添加他,然后我可以添加该员工。如果经理已经在表中,那么我只将经理的EmployeeID作为ManagerID 以下是我的存储过程: CREATE PROCEDURE dbo.CreateEmployee ( @DepartmentID INT, @EmployeeFirstName NVARCHAR(25), @EmployeeLastName NVARCHAR(25),

我正在创建一个存储过程,在其中输入一名员工和一名经理。如果经理不在employee表中,我需要添加他,然后我可以添加该员工。如果经理已经在表中,那么我只将经理的
EmployeeID
作为
ManagerID

以下是我的存储过程:

CREATE PROCEDURE dbo.CreateEmployee (
    @DepartmentID INT,
    @EmployeeFirstName NVARCHAR(25),
    @EmployeeLastName NVARCHAR(25),
    @Salary MONEY = 30000,
    @ManagerFirstName NVARCHAR(25),
    @ManagerLastName NVARCHAR(25)
    )

    AS 
    BEGIN;
        SET NOCOUNT ON;
        SET XACT_ABORT ON;
        DECLARE @ManagerID INT;
        SELECT @ManagerID = dbo.GetEmployeeID (@ManagerFirstName, @ManagerLastName);
        IF (@ManagerID = NULL)
        BEGIN;
            INSERT INTO dbo.Employees (FirstName, LastName)
            VALUES (@ManagerFirstName, @ManagerLastName)
            SELECT @ManagerID = dbo.GetEmployeeID(@ManagerFirstName, @ManagerLastName)

            INSERT INTO dbo.Employees (DepartmentID, FirstName, LastName, Salary, ManagerEmployeeID)
            VALUES (@DepartmentID, @EmployeeFirstName, @EmployeeLastName, @Salary, @ManagerID)
        END;


        ELSE 
        BEGIN;
            INSERT INTO dbo.Employees (DepartmentID, FirstName, LastName, Salary, ManagerEmployeeID)
            VALUES (@DepartmentID, @EmployeeFirstName, @EmployeeLastName, @Salary, @ManagerID)
        END;
    END;
GO
当我测试我的程序时,它会添加员工罚款,但不会添加我输入的经理

以下是我的测试方法:

    EXECUTE dbo.CreateEmployee 
        @DepartmentID = 1,
        @EmployeeFirstName = 'Brock',
        @EmployeeLastName = 'Rigby',
        @Salary = 120000,
        @ManagerFirstName = 'Bob',
        @ManagerLastName = 'Barker'

如果有人能帮我,那就太好了。如果您需要更多信息,请在下面进行注释。

Brock,在sql server中,要检查NULL,必须使用
IS NULL
IS NOT NULL
而不是@ManagerId=NULL(当您需要将值设置为NULL时,这是一种语法)。这可能就是问题所在

IF (@ManagerID IS NULL)-- this! you would never enter if block with @managerId = null
BEGIN;
    INSERT INTO dbo.Employees (FirstName, LastName)
    VALUES (@ManagerFirstName, @ManagerLastName)
    SELECT @ManagerID = dbo.GetEmployeeID(@ManagerFirstName, @ManagerLastName)

    INSERT INTO dbo.Employees (DepartmentID, FirstName, LastName, Salary, ManagerEmployeeID)
    VALUES (@DepartmentID, @EmployeeFirstName, @EmployeeLastName, @Salary, @ManagerID)
END;


ELSE 
BEGIN;
    INSERT INTO dbo.Employees (DepartmentID, FirstName, LastName, Salary, ManagerEmployeeID)
    VALUES (@DepartmentID, @EmployeeFirstName, @EmployeeLastName, @Salary, @ManagerID)
END;

请不要标记无关的RDBMS。MySQL和SQL Server完全不同的产品。从图中可以看出,这似乎是SQL Server(因为这显然是SSMS),因此我删除了SQL Server中的MySQL标记.Brock,要检查NULL,必须执行ManagerId is NULL而不是ManagerId=NULL。这可能就是问题所在。
如果(@ManagerID=NULL)
-这将始终是
false
。任何东西都不能
=NULL
。你需要使用
如果(@ManagerID为NULL)
我将来会向任何人隐藏我的代码,因为这是一个学校项目,我可能会因为把我的东西放在那里而遇到麻烦,但是感谢所有帮助我解决这个问题的人。这个解决方案是正确的,但推理是错误的。我不会说这是设置值的语法。这是检查相等性的正确语法,但由于
NULL
的性质,任何东西都不能等于它-即使是另一个
NULL
-因此对于那些必须使用
is NULL
is not NULL
的人来说,这是有意义的!谢谢Siyual,我不是这么想的。非常感谢,我是在寻找一个更复杂的原因,而不是愚蠢的原因。不客气。我在调试存储过程时使用“print”语句,尤其是那些有许多条件的语句。也许它可以帮助你在未来的调试-只要写一些像打印'内部managerId是空的'等。是的,我会记住这一点,在未来,再次感谢!