我有各种存储过程。我需要一个存储过程来执行存储过程,然后只返回行计数(被调用过程返回的行数),我需要用c#代码接收它。
最好的方法是什么?
情况: 我有各种存储过程,从c#代码调用。现在为了另一个目的,我需要知道一个过程返回的行数(我不想要返回的行,我只需要行数)。我无法更改存储过程本身,因为我的许多c#代码正在使用它们,因此如果我更改过程,事情可能会中断。这就是为什么我要锁定一个过程,它将接受输入并执行一个过程(动态)并返回行数而不是结果或行。
我可以使用存储过程字符串 并像
一样执行它EXEC ('StoredProcedure @Keyword = ''' + @Key + '''')
我在每个可能返回的行中都有Id作为列。我可以存储ID并计算它但我不知道如果那是最好的想法。
我的数据库很大。我可以在c#中使用executenonquery()但是当我用它执行任何存储过程时它返回-1。什么是最好的方式。谢谢。
答案 0 :(得分: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 :(得分:0)
您可以在子存储过程中尝试此操作:
CREATE PROC PawanXX
(
@a INT
,@b INT OUTPUT
)
AS
BEGIN
SELECT TOP 2 * FROM X
SET @b = @@ROWCOUNT
RETURN @b
END
GO
主存储过程我们调用所有其他sps
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行(s)受影响)
2
(1行受影响)