【问题标题】:MS SQL stored procedure returned result sets with ODBCMS SQL 存储过程使用 ODBC 返回结果集
【发布时间】:2009-02-05 01:58:25
【问题描述】:

我有一个存储过程,如果存储过程这样做:

SELECT 0 As Ret
DELETE FROM table where value1 = 1

返回 1 行结果,其值为 0,列名 Ret

但如果我这样做:

DELETE FROM table where value1 = 1
SELECT 0 As Ret

我没有得到任何返回的结果。

我的问题是,如何让第二个变体返回一个值。

我正在使用 C++ 和 ODBC。

【问题讨论】:

    标签: c++ sql sql-server stored-procedures odbc


    【解决方案1】:

    查看 - SET NOCOUNT 的设置。

    【讨论】:

    • +1 虽然很短,但确实指明了正确答案的方向
    【解决方案2】:

    将变量显式设置为@@RowCount,然后返回

    Declare @ret int
    Select @ret = @@RowCount
    Select @ret
    

    编辑

    第二种形式返回 0,因为选择 0 as ret 的行数是 0 行。因此,您需要存储删除后立即返回的行数。

    【讨论】:

    • 我认为您没有理解这个问题。在第二种情况下,它不返回任何行。问题是先删除然后选择。它永远不会返回给我一个结果集。
    • 我实际上希望它在第二种情况下返回 0。 (因此 SELECT 0 As Ret)但问题是它没有返回任何东西。
    • 对不起,我以为您关心的是操纵 @@RowCount 值。您为我提供的两种变体均返回结果(执行后可访问不同的 @@Rowcount 值)。也许你可以分享更多没有收到价值的代码。
    • 我不知道这是否与您的情况有关,但我确实记得在访问受影响的记录数之前无法访问结果集的某些连接方法存在问题。
    【解决方案3】:

    shahkalpesh 是对的,nocount 应该适用于此,尽管我建议不要使用结果集作为返回值,而是使用 RETURN 语句,并询问 proc 的返回值。

    SET NOCOUNT ON 
    DELETE FROM table where value1 = 1
    SET NOCOUNT OFF
    SELECT 0 As Ret
    

    【讨论】:

    • 我认为问题可能是我最终想将我的代码更改为:DELETE FROM table whre value1 = 1 SELECT @@ROWCOUNT
    • SET NOCOUNT ON 会阻止@@ROWCOUNT 被填充吗?
    • nope .. @@ROWCOUNT 将始终被填充,它在使用带有触发器的表时有一些边缘情况,还有其他选项
    【解决方案4】:

    好的,我发现您可以使用 ODBC 调用 SQLMoreResults 来获取下一个结果集。因此,您可以继续调用此 SQLMoreResults 函数,直到没有更多的结果集。

    在我调用 SQLMoreResults 之后,我得到了预期的结果集。

    这很酷,因为这意味着单个存储过程可以返回多个结果集。我从来不知道它可以。

    @Sambo99 和@shakalpesch 你的建议也有效,并且只返回 1 个结果。

    【讨论】:

      猜你喜欢
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-19
      • 2014-12-07
      • 1970-01-01
      相关资源
      最近更新 更多