为什么我的 SQL 代码没有执行存储过程

Why is my SQL code not executing the stored procedure

因此 objective 是为了显示安全性,因此这是在来宾用户帐户下完成的。我授予来宾用户执行此代码的权限。但是我不断收到 NUll 错误

Cannot insert the value NULL into column , table ; column does not allow nulls. INSERT fails. The statement has been terminated. The 'vc_AddUserLogin' procedure attempted to return a status of NULL, which is not allowed. A status of 0 will be returned instead.

所以我已经试过了EXEC vc_AddUserLogin 'The Doctor', 'Gallifrey'

这是程序的代码

CREATE PROCEDURE vc_AddUserLogin(@userName varchar(20) , @loginFrom varchar(50)) 
AS
BEGIN
    DECLARE @userID int
    SELECT @userID = vc_UserID FROM vc_User
    WHERE UserName = @userName
    INSERT INTO vc_UserLogin (vc_UserID, LoginLocation)
    VALUES (@userID, @loginFrom)
    RETURN @@identity 
END

预期的结果应该是更新的用户 ID 和登录名。我不是在寻找答案,只是有人指出我正确的方向,因为我迷路了。这应该很容易,我可能想多了。

不要 return 来自存储过程的值,除了作为过程的状态。相反,使用 OUTPUT 参数。

我还建议使用 OUTPUT 子句,如:

CREATE PROCEDURE vc_AddUserLogin (
    @userName varchar(20) ,
    @loginFrom varchar(50),
    @id int OUTPUT
) AS
BEGIN
    DECLARE @ids TABLE (id int);  
    INSERT INTO vc_UserLogin (vc_UserID, LoginLocation)
        OUTPUT id INTO @ids  -- "id" is the name of the id column in vc_UserLogin
        SELECT u.vc_UserId, @loginFrom
        FROM vc_users u
        WHERE u.UserName = @userName;

    SELECT @id = id
    FROM @ids;
END;

然后您将此代码称为:

DECLARE @id int;

EXEC vc_AddUserLogin @userName, @loginFrom, @id OUTPUT;

SELECT @id;

如果没有用户匹配 @userName,这将 return NULL