1

实际上,我需要捕获存储过程的每个查询(更新/删除)和受其影响的行以便跟踪。您可以假设该存储过程仅包含删除和更新命令。

我创建了以下功能

CREATE Function [dbo].[CURRENT_Query] (@SPID int)
Returns nvarchar(max) 
Begin 
Declare @CURRENT_Query  nvarchar(max)
SET @CURRENT_Query =(SELECT t.text
FROM sys.dm_exec_requests AS r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) AS t
WHERE session_id =  @SPID   )
Return @CURRENT_Query
End

然后触发以下查询

declare @row_count int 
Update t set T_id =20
from table_name t
where t_id in ('10','11','12')

set @row_count =(select @@rowcount)

select dbo.CURRENT_Query(@@spid),@row_count

现在我想捕获查询和受它影响的行数。我也尝试过在该表上使用更新后触发器

EXEC sp_executesql N'DBCC INPUTBUFFER(@@spid) WITH NO_INFOMSGS'

但我无法捕捉到受查询影响的行数。

我也尝试使用以下查询

DECLARE @sqltext VARBINARY(128)
SELECT @sqltext = sql_handle
FROM sys.sysprocesses
WHERE spid = 104
SELECT TEXT
FROM sys.dm_exec_sql_text(@sqltext)

请建议优化的解决方案,以便我可以跟踪存储过程中表上的每个查询和行数

4

1 回答 1

0

这是检查最近运行的前 1000 个 sql 的示例。希望它可以帮助你。

SELECT TOP 1000 
QS.creation_time, 
SUBSTRING(ST.text,(QS.statement_start_offset/2)+1, 
((CASE QS.statement_end_offset WHEN -1 THEN DATALENGTH(st.text) 
ELSE QS.statement_end_offset END - QS.statement_start_offset)/2) + 1 
) AS statement_text, 
ST.text, 
QS.total_worker_time, 
QS.last_worker_time, 
QS.max_worker_time, 
QS.min_worker_time 
FROM 
sys.dm_exec_query_stats QS 
CROSS APPLY 
sys.dm_exec_sql_text(QS.sql_handle) ST 
ORDER BY 
QS.creation_time DESC
于 2018-04-04T14:22:09.560 回答