存储过程返回0而不是值

时间:2018-11-12 03:35:44

标签: sql sql-server rdbms

有一个存储过程可以返回前1个结果作为

USE [DB]
GO
.....

CREATE PROCEDURE [dbo].[GET] 
    (@in VARCHAR(10), @Out VARCHAR(10) OUTPUT)
AS 
    SELECT top 1 @Out = tab.Col  
    FROM table tab


    RETURN
GO

当我在主查询中调用它

DECLARE @output VARCHAR(10)
DECLARE @in VARCHAR(10)
DECLARE @Out VARCHAR(10)

EXECUTE dbo.GET @in = 'table', @Out = @output

它将@output打印为0;

但如果我这样做

EXECUTE dbo.GET @in = 'table', @Out = @Out

然后打印@out,我得到正确的值。

为什么会这样?

我确实将输出@Out传递给了预定义变量@output

2 个答案:

答案 0 :(得分:2)

由于存在“ dbo”和sqlserver标记而假定SQLS

您在过程中的查询未将值分配给out参数(称为@out),而是将其分配给了其他变量@outpk。解决命名不匹配并使它们相同的情况

Sqlserver不支持LIMIT。要限制结果集的大小,请使用SELECT TOP 1 *。在不使用ORDER BY的情况下使用TOP(或任何类似的结果集限制器)是不合逻辑的。指定ORDER BY

在sqlserver中,调用过程时,必须使用OUTPUT关键字传递输出参数:

EXEC sprocname @inputparameter ='value', @outputparameter = @variableToSet OUTPUT;

使用分号;不推荐使用它们


示例

USE [DB]
GO

CREATE PROCEDURE [dbo].[GET] 
    (@in VARCHAR(10), @OutPk VARCHAR(10) OUTPUT)
AS 
    SELECT @OutPK = tab.Col  
    FROM table tab
    ORDER BY tab.Col;
GO

DECLARE @output VARCHAR(10);

EXECUTE dbo.GET @in = 'table', @OutPK = @output OUTPUT

SELECT @output;

答案 1 :(得分:0)

如果它的MySql(限制位于mySql中),则可以简单地调用:

Call dbo.GET('table', @out);

不需要单独的变量@output