我正在尝试编写一个过程,该过程根据选择查询结果返回值。就像查找用户的ID一样,使用名和姓来查找用户ID,然后将ID作为OUTPUT参数返回。如果找到一个或多个用户,则将返回值设置为-1,并将OUTPUT参数设置为0。
我尝试了以下代码,但出现错误:
必须声明标量变量“ @intValue”
我已经在互联网上搜索了,但没有一个解决我的问题。
CREATE PROCEDURE GetIdOfUser
(@f_name VARCHAR(50),
@l_name VARCHAR(50),
@outValue INT OUTPUT)
AS
DECLARE @intValue INT;
SELECT @intValue = userID
FROM users
WHERE firstName = @f_name AND lastName = @l_name
IF @@rowcount > 1 -- more than one user?
BEGIN
SET @outValue = 0
RETURN -1;
END
IF @@rowcount == 1
BEGIN
SET @outValue = @intValue;
END
DECLARE @myretValue INT;
EXEC GetIdOfUser 'raj', 'ahuja', @myretValue;
SELECT @myretValue;
我正在使用SQLfiddle [sqlfiddle.com]学习SQL Server概念。我是在SQL Server中创建过程的新手,所以将不胜感激。
编辑1: SQL Server版本为2017
编辑2:我正在使用的架构和示例数据。
create table users
(
userID int,
firstName varchar(50),
lastName varchar(50),
title varchar(50)
);
insert into users(userID, firstName, lastName, title)
values(501, 'natasha', 'ghosh', 'title1'),
(502, 'raj', 'ahuja', 'title2'),
(503, 'katy', 'perry', 'title3'),
(504, 'john', 'cyrus', 'title4'),
(505, 'anindita', 'pal', 'title5');
答案 0 :(得分:3)
我会简化一点。无需在此处填充多个变量。看看这样简单的方法是否可行。
CREATE PROCEDURE GetIdOfUser
(
@f_name VARCHAR(50),
@l_name VARCHAR(50),
@outValue INT OUTPUT
)
AS
SELECT @outValue = userID
FROM users
WHERE firstName = @f_name
AND lastName = @l_name
if @@rowcount > 1
set @outValue = -1
GO
这是您将如何使用它。
DECLARE @myretValue INT;
EXEC GetIdOfUser 'raj', 'ahuja', @myretValue OUTPUT;
SELECT @myretValue;
-编辑-
由于您发布了两个不同的名称,因此我决定使用表名称专家来处理新的示例数据。我在这里发布的过程非常完美。
create table specialist(
userID int,
firstName varchar(50),
lastName varchar(50),
title varchar(50)
);
insert into specialist(userID, firstName, lastName, title) values(501, 'natasha', 'ghosh', 'title1');
insert into specialist(userID, firstName, lastName, title) values(502, 'raj', 'ahuja', 'title2');
insert into specialist(userID, firstName, lastName, title) values(503, 'katy', 'perry', 'title3');
insert into specialist(userID, firstName, lastName, title) values(504, 'john', 'cyrus', 'title4');
insert into specialist(userID, firstName, lastName, title) values(505, 'anindita', 'pal', 'title5');
GO
CREATE PROCEDURE GetIdOfUser
(
@f_name VARCHAR(50),
@l_name VARCHAR(50),
@outValue INT OUTPUT
)
AS
SELECT @outValue = userID
FROM specialist
WHERE firstName = @f_name
AND lastName = @l_name
if @@rowcount > 1
set @outValue = -1
GO
DECLARE @myretValue INT;
EXEC GetIdOfUser 'raj', 'ahuja', @myretValue OUTPUT;
SELECT @myretValue;
答案 1 :(得分:1)
尝试这个
/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
答案 2 :(得分:1)
您遇到了多个问题,我将尝试以最小的更改使它正常工作。
CREATE PROCEDURE GetIdOfUser
(@f_name VARCHAR(50),
@l_name VARCHAR(50),
@outValue INT OUTPUT)
AS
DECLARE @intValue INT
默认情况下,SQL小提琴使用;
结束批处理,将其更改为GO
或删除;
SELECT @intValue = userID
FROM users
WHERE firstName = @f_name AND lastName = @l_name
SET @outValue = CASE WHEN @@rowcount = 1 THEN @intValue ELSE 0 END
使用case语句简化了此过程,此处不需要多个if语句。同样,您的原始支票是大于或等于,不小于(当未找到行时),在这种情况下将返回0。这样可以处理所有情况。
GO
结束批处理,否则以下代码也将成为过程的一部分。我相信将所有过程逻辑放在BEGIN ... END
中也可以。
DECLARE @myretValue INT
EXEC GetIdOfUser 'raj', 'ahuja', @myretValue OUTPUT
在过程调用中,您需要将输出变量定义为OUTPUT
才能真正起作用,否则sql不会设置该变量的值。
SELECT @myretValue
使用上述代码,一切正常,我得到响应502
,小提琴链接-http://sqlfiddle.com/#!18/ddb50/47