Могу ли я создать функцию для отслеживания недавно выполненного запроса и строк, на которые он влияет?
На самом деле, мне нужно отлавливать каждый запрос (обновление / удаление) и затрагиваемые им строки хранимой процедуры, чтобы отслеживать. Вы можете предположить, что эта хранимая процедура содержит только команды удаления и обновления.
Я создал следующую функцию
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)
Пожалуйста, предложите оптимизированное решение, чтобы я мог отслеживать каждый запрос и количество строк в таблице в хранимой процедуре
1 ответ
Это пример проверки последних 1000 sqls, запущенных за последнее время. Надеюсь, это поможет вам.
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