为什么我的 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
。
因此 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
。