【问题标题】:Get count of rows returned by a locked stored procedure WITHOUT @@rowcount获取锁定的存储过程返回的行数,而不使用 @@rowcount
【发布时间】:2020-07-25 02:16:59
【问题描述】:

作为我在 Microsoft SQL Server 中编写的自动化脚本的一部分,我需要计算存储过程返回的行数,不幸的是,此存储过程已锁定/加密,并且在 @ 之后有一个 DROP TABLE 语句987654322@ 语句将 @@rowcount 重置为 0。

有什么方法可以获取/捕获该存储过程返回的行的行数,而无需更改存储过程中的代码?

【问题讨论】:

  • 如果行仍然返回给客户端,为什么需要获取它们的计数?
  • select 后的第一条语句,将@@rowcount 赋值给一个变量....
  • 这是干什么用的?如果您只是在做一些临时手动分析,您可以查看SELECT last_rows,* FROM sys.dm_exec_procedure_stats ps JOIN sys.dm_exec_query_stats qs ON qs.plan_handle= ps.plan_handle where ps.object_id = object_id('dbo.YourProc'),但我不会在生产代码中使用类似的东西

标签: sql sql-server stored-procedures rowcount


【解决方案1】:

您可以 INSERT...EXEC 到临时表或表变量中,然后计算表中的行数。

类似这样的:

create proc rr as
select 1 aa, 1 bb union select 2, 2

declare @t table (aa int, bb int)
declare @c int

insert into @t
exec rr

select @c = count(*) from @t

【讨论】:

  • 感谢@Gary Martirosyan,您的解决方案对我来说非常有用,如果预计 Store Proc 会返回大量数据,我想我可以使用表来存储输出(而不是表类型变量。
【解决方案2】:

一种方法是在 proc 执行时捕获消息并从中选择“受影响的行”详细信息(假设 proc 返回行一次,您可以添加多个返回)。

尝试以下方法:

CREATE TABLE #temp (run_details varchar(1000)) 
INSERT INTO #temp
EXEC master..xp_cmdshell 'SQLCMD -S "Server\Instance" -Q "exec db_name.schema_name.proc_name"'
SELECT TOP 1 replace(replace(t.run_details, '(', ''), 'rows affected)', '') Rows_affected_by_proc FROM #temp t
WHERE t.run_details LIKE '(% rows affected)'

结果:

【讨论】:

  • @MasoudR 不,'set nocount on' 会杀死这些消息,但 OP 肯定会收到这些消息,因为它提到 @@rowcount 没有帮助,因为 proc 中有 drop 语句。
  • @@rowcount 和NOCOUNT 是完全正交的。关闭NOCOUNT 只会抑制发送回客户端的行数。它不会阻止 @@ROWCOUNT 工作
  • @MartinSmith 对,OP 不能使用 @@rowcount 仅仅是因为 SP 中的 drop table 语句。
  • 感谢@Sacse,我认为您的方法会奏效,但在我们的组织中,我们不鼓励使用/启用“xp_cmdshell”,但无论如何感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
相关资源
最近更新 更多