有一个存储过程可以返回前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
答案 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
。