从另一个存储过程获取存储过程的行数

5

我有各种不同的存储过程。我需要一个存储过程来执行另一个存储过程,并仅返回行计数(被调用过程返回的行数),我需要在c#代码中接收它。

最好的方法是什么?

2个回答

2

假设您正在使用 SQL Server(从代码片段可能是这样),也许像这样的代码可以适用于您:

exec('exec <your stored procedure goes here>; select @@RowCount')

由于您正在运行SQL Server,我可以想到一个不一定完美的解决方案。

创建一个临时表(如果您有更高版本的SQL Server,则使用表变量)。 然后执行:

exec(`
declare @t table (
   <columns go here>
);

insert into @t
    exec(''<your exec here>'');

select @rowcount
');

现在我已经说过了,我建议使用sp_executesql。它的用法如下:

declare @sql nvarchar(max) = N'exec '+@YOURQUERY + '; set @RowCount = @@RowCount';

exec sp_executesql @sql, N'@RowCount int output', @RowCount = RowCount output;

我昨天大部分时间都在调试一个很晦涩的问题,当你在插入数据时调用存储过程会引发这个问题。


1
+1 对于 @@rowcount... 但他似乎表明他想以某种方式抑制被调用存储过程返回的结果集。 - Michael Fredrickson
但是它也返回了行。 在消息中我看到影响了385行然后又出现影响了1行没有服务器管理工作室。 - user1711245
有没有办法从存储过程返回的结果中获取单个列,比如: select id from exec 'stored procedure' - user1711245
1
@KDB……我目前想不到什么好的方法。但是既然它们是 您的 存储过程,为什么不加一个可选的输出参数来获取行数呢?这样您就不需要更改现有的代码,同时还能得到您想要的结果。 - Gordon Linoff
我会进入那个问题。你能告诉我如何用C#读取它吗?感谢您的回复。另外一件事是,当我在SQL Server Management Studio中执行存储过程时,会出现一个消息,显示有555行受到影响。我能用C#获取那个消息吗? - user1711245
@KDB . . . 这个答案可能会对您有所帮助 https://dev59.com/1W025IYBdhLWcg3wHR8Y. - Gordon Linoff

0
您可以尝试将以下内容添加到您的子存储过程中:
CREATE PROC PawanXX
(
 @a INT
,@b INT OUTPUT
)
AS
BEGIN

SELECT TOP 2 * FROM X

SET @b = @@ROWCOUNT

RETURN @b

END
GO

这是主要的存储过程,我们在其中调用所有其他的存储过程。

 DECLARE @RC int
 DECLARE @a int
 DECLARE @b int

EXECUTE @RC = [dbo].[PawanXX] 
   @a
  ,@b OUTPUT

SELECT @RC

同一进程名称的输出 ProcessName 父进程 子进程


ShareDrafts Job12 Job03 ShareDrafts Job13 Job58

(影响了2行)


2

(1行受影响)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接