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

时间:2019-06-18 13:50:36

标签: sql sql-server executable store

因此,此操作的目的是为了显示安全性,因此此操作是在访客用户帐户下进行的。我授予来宾用户执行此代码的权限。但是我一直收到NUll错误

  

不能将NULL值插入column,table;列不   允许为空。 INSERT失败。该语句已终止。的   “ vc_AddUserLogin”过程尝试返回NULL状态,   这是不允许的。而是返回状态0。

所以我已经尝试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

预期结果应该是更新的用户名和登录名。我并不是在寻找答案,只是有人因为我迷路而将我指向正确的方向。这应该很容易,我可能会考虑过度。

1 个答案:

答案 0 :(得分:0)

除了作为过程的状态外,不要从存储过程中返回值。而是使用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;

如果没有用户匹配NULL,它将返回@userName