【问题标题】:Avoid returning result set from stored procedure避免从存储过程返回结果集
【发布时间】:2011-03-20 18:37:51
【问题描述】:

假设我有一些返回结果集的存储过程(我无法更改它):

create procedure test_procedure
as
begin

    select 1

end

我知道我可以将结果集插入到表中,所以它会对调用代码隐藏:

declare @t table(i int)

insert into @t
exec test_procedure

还有其他方法可以隐藏调用代码返回的结果集吗?

更新

看起来我有点困惑。我只寻找 T-SQL 答案(不是 .NET 答案)。

【问题讨论】:

  • 返回这个结果集到底有什么问题?您总是可以忽略结果集并让垃圾收集器处理它。
  • @Cylon Cat RE“让垃圾收集器处理它”甚至不是这种情况。 TDS 是一种流式传输协议...如果您不读取结果,它不一定会返回给客户端。即使它的一部分返回给客户端,它们也可以用本机代码处理,除非使用 DataReader 等人读取。
  • Cylon Cat:如果我不能忽略结果集怎么办?例如调用我的过程的代码假定没有返回结果集。
  • @Andrew Ah ... 致电Command.ExecuteNonQuery(不会读取结果集)或Command.Cancel(如果您只想读取部分结果集)。正如我之前所说,TDS 是流协议,使用 ExecuteNonQuery 将导致没有完整的结果集返回给客户端(如果结果集很小我可能会相信)
  • 我已经更新了问题。我只寻找 SQL 答案,而不是 .NET 答案。通过调用代码,我的意思是另一个存储过程,或者一些 sql 批处理。

标签: sql-server tsql stored-procedures resultset


【解决方案1】:

不,没有其他解决方案。但是,您应该重构您的过程,只做您需要的事情。如果您需要其他调用的输出,请尝试将过程分成两部分。

【讨论】:

    【解决方案2】:

    使用可选的输出参数。

    或使用以下情况

    Create procedure Check @c int
    as
    begin
    if @c = 1
        select 1
    else
        print 1 
    end
    

    编写任何满足并返回指定值的条件。 将该参数用作可选参数,这样您的程序就不会发生其他变化。

    【讨论】:

      【解决方案3】:

      您是否愿意尝试通过输出参数返回数据,并返回状态码作为过程的返回值?

      您无法通过该输出参数轻松返回完整的结果集,但您可以以您选择的格式返回一些分隔数据。

      【讨论】:

      • 正如我所说,我无法更改返回结果集的存储过程。
      • 你能把它包装在另一个你可以控制的过程中吗?您的包装器可能会丢弃结果集。
      猜你喜欢
      • 1970-01-01
      • 2016-03-27
      • 2023-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多