【问题标题】:Store the multiple result sets from stored procedures to different tables将存储过程中的多个结果集存储到不同的表中
【发布时间】:2018-05-21 02:43:47
【问题描述】:

我有大约 30 到 40 个存储过程,它们有多个结果集作为输出。我的实际要求是计算 SQL Server 中各个过程的每个结果集中的行数。

我可以更改程序并为每个结果集使用count()。然而,实际上改变 30 到 40 个程序是一项繁琐的工作。而是做同样的事情,我试图使用openquery 进程并将过程的输出存储到一些临时表中。

但是,这样我只能存储第一个结果集,而不能存储任何其他后来的结果集。即使我试图使用游标来实现相同的目标,但它不起作用。你能帮帮我吗?

代码如下:

  create table Orders
   (
      Slno int,
      OrderID Char(20),
      NumberOfItem int,
      CustomerID int
    )

   Create table Customer
                 (
                   CustomerID int,
           CustomerName Char(30),
                   Address nChar(50)
                  )

   Insert into Customer values (1,'Piyu','Bhubaneswar'),
                         (2,'Ranu','Bhubaneswar'),
                         (3,'Tiku','Cuttack'),
                         (4,'Lui','Bhadrak'),
                         (5,'Wasim','Bhadrak'),
                         (6,'Vivek','Dhekanal'),
                         (7,'Romeo','Puri')

    Insert into Orders Values (1,'O1',2,1),
                              (2,'O2',7,1),
              (3,'O3',20,4),
              (4,'O4',2,3),
              (5,'O5',3,3),
                  (6,'O6',1,7),
              (7,'O7',1,5),
                      (8,'O8',3,1),
              (9,'O9',2,6)

    Select * from Orders
    Select * from Customer                 

    Alter Procedure OrderDetails
    @Var_TotalItems Int

    As
    Begin

        Select C.CustomerName,C.[Address ],O.NumberOfItem,O.OrderID   From 
        Customer C
        Join
        Orders O
        On C.CustomerID=O.CustomerID

        Select C.CustomerName,Sum(O.NumberOfItem) 
        [TotalNumberOfItem],Count(O.OrderID) [TotalNumberOfOrders]   From 
        Customer C
        Join
        Orders O
        On C.CustomerID=O.CustomerID
        Group by C.CustomerName
        Having Sum(O.NumberOfItem) >= @Var_TotalItems
    End

      EXEC OrderDetails 4

这里的过程返回多个输出。我的目标是在不更改存储过程的情况下计算每个输出中的行数。

【问题讨论】:

  • 对不起,我的回答是错误的。你应该用谷歌 OPENROWSET('') 来执行 store proc。我不确定你的要求。将不同的 para 值传递给同一个 proc 可以返回不同的 rowcount。还有所有 proc接受不同的参数,并且它们的数据类型不同。假设您再增加一个接受日期作为参数的 proc。您将如何传递值以及如何知道它。
  • 我已经尝试过使用 openrowset()。它只获取第一个结果集,而不是后面的结果集。你能建议我有什么方法可以使用一些循环或光标来完成我的要求吗?
  • 你没有解释整个场景。我希望你以正确的方式满足你的原始要求。不是我只看到一个解决方案。假设你使用 c#,.net 作为前端,那么你可以从前端执行proc并填充数据集。然后你可以使用dataset.Table[0].rows.count,dataset.Table[1].rows.count等等。

标签: sql sql-server database tsql stored-procedures


【解决方案1】:

您可以使用系统变量@@ROWCOUNT 来获取受您的查询影响的行数。

@@ROWCOUNT 的值会根据您上一条语句(选择/插入/更新/删除)影响的行数进行更新。因此,在执行存储过程后,您可以检查 @@ROWCOUNT 中的值以获取该过程返回的行数。像这样

declare @c int
exec OrderDetails
select @c =@@Rowcount

select @c

在这里,OrderDetails 过程返回的行数将存储在用户定义的变量@c 中,您可以将其用于任何其他操作。

请参阅this Link 以了解有关@@ROWCOUNT 的更多详细信息

【讨论】:

  • @@Rowcount 将返回受上一条语句影响的 ows 数(选择/插入/更新/删除)。但是,我还需要跟踪以前的行数。我的程序在结果集中有多个输出。所以我想在不改变存储过程的情况下计算所有结果集中的行数。
  • 尝试将它们插入到临时表或表变量中,以便您以后可以根据需要以任何顺序获取它们
  • 我已经尝试将结果集插入到 Temp 表中。但是,临时表只获得第一个结果集而不是后面的结果集。
猜你喜欢
  • 2011-07-15
  • 2021-01-10
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 2012-07-19
  • 2019-04-26
  • 1970-01-01
相关资源
最近更新 更多