我有大约 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
这里的过程返回多个输出。我的目标是在不更改存储过程的情况下计算每个输出中的行数。
您可以使用系统变量@@ROWCOUNT来获取查询影响的行数。
@@ROWCOUNT 的值将更新为受最后一条语句( select / insert / update / delete )影响的行数。因此,在执行存储过程后,您可以检查@@ROWCOUNT 中的值来获取过程返回的行数。像这样
declare @c int
exec OrderDetails
select @c =@@Rowcount
select @c
这里,过程 OrderDetails 返回的行数将存储在用户定义的变量 @c 中,您可以将其用于任何其他操作。
请参阅此链接了解有关@@ROWCOUNT的更多详细信息
我只是从两个 sql 脚本中获取了计数并将其设置在两个不同的变量中。最后,添加 then 并在第三个变量中设置值。