【问题标题】:SQL Server Stored Procedure store return valueSQL Server 存储过程存储返回值
【发布时间】:2010-11-23 10:32:23
【问题描述】:

直升机,

我的问题是我在 SQL Server 中有一个存储过程,它返回一个字段的计数。我想将此存储过程的结果存储在不同存储过程的变量(标量?)中。

sp_My_Other_SP:

CREATE PROCEDURE [dbo].sp_My_Other_SP
@variable int OUTPUT -- The returned count
AS

BEGIN -- SP

SET NOCOUNT ON;

SET @SQL = "SELECT COUNT(*) FROM blah"
EXEC(@SQL)

END -- SP

我目前的做法是:

DECLARE @count int

EXEC sp_My_Other_SP @count OUTPUT

然后我像使用它

IF (@count > 0)
BEGIN
...
END

但是,它返回其他存储过程结果以及主存储过程结果,这在我的 .NET 应用程序中是一个问题。

-----------
NoColName
-----------
14

-----------
MyCol
-----------
abc
cde
efg

(以上是返回结果集的尝试表示)

我想知道是否有办法将存储过程的结果存储到不输出它的变量中。

感谢您的帮助。

【问题讨论】:

  • 您必须向我们展示更多代码,因为您的问题不清楚。
  • 我同意..向我们展示整个上下文..对“其他”存储过程的调用。
  • 问题是返回计数的 sproc 包含的数量多于其结果集中的数量,并且此输出在第二个 sproc 中出现。

标签: sql sql-server sql-server-2005 sql-server-2008 stored-procedures


【解决方案1】:

您可以将存储过程的结果捕获到一个临时表中,这样调用存储过程就不会返回它。

create table #temp (id int, val varchar(100))
insert into #temp
exec sp_My_Other_SP @value, @value, @value, @count OUTPUT

【讨论】:

  • 我使用了这种方法,而不是哈希表,我使用了 TABLE 标量类型,例如: DECLARE @temp_tbl TABLE( value int ) INSERT INTO @temp_tbl EXEC sp_My_SP SET @count = (SELECT TOP 1 value FROM @temp_tbl)
  • 这当然效率较低,因为您选择的是您不关心的数据。如果您只是在寻找计数,最好向 sp_My_Other_SP 添加一个新参数来控制是否返回结果集。
  • 这没有意义,我关心计数,因为我会一直使用它,它对 SP 的其余部分至关重要。
【解决方案2】:

嗯,解决这个问题的最简单方法是重新编码存储的过程,以便在这种情况下返回您不想要的“其他”结果集的 select 语句有条件地执行,只有当您不要求数

添加另一个名为@GetCount 的参数

@GetCount TinyInt Defualt = 0 // or
@GetCount Bit Default = 0 

然后 而不仅仅是

Select ...

   If @GetCount = 1
     Select ...

【讨论】:

    【解决方案3】:

    你尝试过改变

    SET @SQL = "SELECT COUNT(*) FROM blah" 
    EXEC(@SQL) 
    

    SELECT @variable = COUNT(*) FROM blah" 
    -- don't do EXEC(@SQL) 
    

    ?

    【讨论】:

      【解决方案4】:
      THE FIRST PROCEDURE:
      CREATE PROC DD43
      @ID INT OUTPUT AS
      (SELECT @ID=COUNT(*) FROM CS2)
      
      SECOND PROCEDURE:
      
       CREATE PROC DD45 AS
       DECLARE @COUNT INT
       DECLARE @COUN INT
       EXEC DD43 @COUN OUT --CALLING THE FIRST PROCEDURE
       SET @COUNT= (SELECT @COUN)
       SELECT @COUNT
      
       EXEC DD45 
      

      【讨论】:

      • 虽然这段代码可能会回答这个问题,但最好解释一下它是如何解决问题的以及为什么要使用它。从长远来看,纯代码的答案没有用处。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-04-03
      • 2020-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-06
      相关资源
      最近更新 更多