【问题标题】:Return value from stored procedure is not correct存储过程的返回值不正确
【发布时间】:2017-01-27 04:21:34
【问题描述】:

我在 SQL Server 2016 中有这个存储过程:

SET NOCOUNT ON;
SELECT * FROM MyTable;
RETURN  @@ROWCOUNT

当我在 SSMS 中运行此过程时,返回值应该是 43。

我的应用程序中有这个代码 sn-p:

com = New SqlCommand("MyQuery", conn)
com.CommandType = CommandType.StoredProcedure
prm = New SqlParameter
With prm
    .DbType = DbType.Int32
    .Direction = ParameterDirection.ReturnValue
End With
com.Parameters.Add(prm)
conn.Open()
Dim rdr As SqlDataReader = com.ExecuteReader
While rdr.Read
    Debug.WriteLine(rdr(0))
End While
Debug.Write(prm.Value Is Nothing)

While 循环中的 Debug 语句打印出第一列中的所有数据,因此我知道它们都在协同工作,但最终 Debug 语句的结果为 True。为什么我没有得到我的返回值?

编辑: 答案在我的应用程序代码中,而不是在 SQL 中。保持 SQL 不变,我通过将 prm 循环内的第二行更改为:

RetVal = ParameterDirection.ReturnValue

现在,RetVal 包含返回值。现在看来,这是有道理的。

【问题讨论】:

  • 你只需要一个表的行数?
  • 是的,您只需要行数还是需要数​​据和行数?
  • 如果我是对的,“ReturnValue”是针对存储过程的。如果您正在执行普通的 SELECT ... 那么返回的值是 DataReader 的字段。
  • 我将所有返回的数据用于其他目的,所以,不,我需要的不仅仅是行数......
  • @muffi 让我做两个 cmets。首先,在 SSMS 中执行存储的查询会返回行并将返回值设置为行数。由于这两个值都是由 SQL 生成的,所以在我看来,我应该能够得到它们。特别是鉴于“ReturnValue”是参数允许的方向之一。其次,假设这不是真的。除了行之外,还有什么方法可以从数据库中获取返回值(或其他参数)?

标签: sql-server vb.net stored-procedures


【解决方案1】:

尝试稍微修改您的存储过程:

DECLARE @RetVal int
SET NOCOUNT ON;
SELECT * FROM MyTable;
SET @RetVal = @@ROWCOUNT
RETURN  @RetVal

如果这不起作用,请尝试使用 @RetVal 设置

SELECT @RetVal = COUNT(*) FROM MyTable

【讨论】:

  • 我将把它标记为答案,因为它迫使我重新考虑如何实际获取行数。答案在我对 OP 的编辑中。
【解决方案2】:

请按照下面给出的更新查询。

SELECT * FROM MyTable;
SELECT  @@ROWCOUNT as Row_Count

更新 SP 后,在 Dataset 中获取数据,在 Dataset 的第二张表中,您将获得行数的值。

【讨论】:

  • 我现在不使用数据集,所以我会先尝试 Skippy 的建议,看看我能得到什么。
猜你喜欢
  • 1970-01-01
  • 2016-01-12
  • 2017-07-12
  • 2011-10-13
  • 2017-12-06
  • 1970-01-01
  • 2015-03-12
  • 1970-01-01
相关资源
最近更新 更多