如何在sql server中的查询中设置存储过程的变量

时间:2016-10-13 11:44:47

标签: sql sql-server

我想从查询中获取sp中的数据并将其设置为变量。 以下是我的查询

WHILE ( ( SELECT COUNT(*) AS [COUNT]
          FROM ( SELECT TOP 1 tbl_PurchaseRequisitionOrOrder.AdditionalRefNumberPO
                 FROM dbo.tbl_PurchaseRequisitionOrOrder
                 WHERE tbl_PurchaseRequisitionOrOrder.AdditionalRefNumberPO IS NOT NULL
                 ORDER BY tbl_PurchaseRequisitionOrOrder.PROId DESC
               ) AS T122
        ) > 0 )
    DECLARE @rr VARCHAR(9)= ( SELECT TOP 1 tbl_PurchaseRequisitionOrOrder.AdditionalRefNumberPO
                              FROM dbo.tbl_PurchaseRequisitionOrOrder
                              WHERE tbl_PurchaseRequisitionOrOrder.AdditionalRefNumberPO IS NOT NULL
                              ORDER BY tbl_PurchaseRequisitionOrOrder.PROId DESC
                            );
          SET @rr= EXEC dbo.GetAddiRefNumberPO @rr 

但我得到了 关键字' EXEC'

附近的语法不正确

on

 SET @rr= EXEC dbo.GetAddiRefNumberPO @rr 

我正在使用sql server 2014 请帮助:)

2 个答案:

答案 0 :(得分:1)

如果您想将SP中的数据放入变量 - 您需要使用OUTPUT

ALTER PROCEDURE dbo.GetAddiRefNumberPO
    ...
    @rr VARCHAR(9) OUTPUT
AS
...

然后你就可以使用它:

DECLARE @rr VARCHAR(9);

EXECUTE dbo.GetAddiRefNumberPO ... @rr = @rr OUTPUT

SELECT @rr

在上一次选择中,您将获得从SP执行中获得的值。

主要问题是 - 你正在使用WHILE循环,所以你得到了一些@rr,然后将它传递给SP并尝试在该变量中写入SP的输出,但是在下一次运行时你会得到另一个{{ 1}}来自您的查询。也许你需要使用另一个变量?这个查询的目的是什么?

答案 1 :(得分:0)

首先,不要在COUNT()条件下使用IF。只需使用EXISTS

其次,您需要BEGIN / END

WHILE (. . . )
BEGIN
    DECLARE @rr VARCHAR(MAX)= (SELECT TOP 1 o.AdditionalRefNumberPO
                               FROM dbo.tbl_PurchaseRequisitionOrOrder o
                               WHERE o.AdditionalRefNumberPO IS NOT NULL
                               ORDER BY o.PROId DESC);
     EXEC dbo.GetAddiRefNumberPO @rr ;
END;

注意:

  • 存储过程返回整数,而不是字符串。所以,如果你想要返回值,你需要一个整数变量,而不是一个字符串。但是你没有使用retval,所以我把它删除了。
  • 您的错误是因为WHILE仅声明变量@rrEXECWHILE循环之后的下一个语句。
  • 我建议您始终使用BEGIN / END来处理任何控制语句,例如WHILEIF。现在你知道了为什么。
  • 表别名使查询更易于编写和阅读。