存储过程returns 0 而不是值

Stored procedure returns 0 instead of value

有一个存储过程可以 return 前 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

如果是MySql(限制在mySql),你可以直接调用:

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

不需要单独的变量@output

假设 SQLS 由于存在 'dbo' 和 sqlserver 标记

您在过程中的查询没有为 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;