如何使用输入和输出参数调用SQL Server过程?

时间:2019-05-21 19:49:51

标签: sql-server stored-procedures parameter-passing

我正在尝试编写一个过程,该过程根据选择查询结果返回值。就像查找用户的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');

3 个答案:

答案 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