Sql-Server-2008-R2

需要腳本來查找在 SQL 中呼叫的 SP

  • January 1, 2018

我無法跟踪每天早上 7 點執行的儲存過程。是否有任何腳本可以檢查哪個作業呼叫了該特定 SP?

SQL Server 代理作業定義儲存在msdb數據庫中的sysjobssysjobsteps表中。您可以使用以下查詢對這些表進行純文字搜尋:

SELECT *
FROM msdb.dbo.sysjobsteps
WHERE subsystem='TSQL' AND
     command LIKE '%nameofmyprocedure%'

請注意,在某些情況下您的儲存過程仍然不會顯示。

  • 如果作業執行另一個儲存過程,該作業又會啟動您要查找的儲存過程
  • 如果 SSIS 包啟動儲存過程
  • 如果該過程不是由 SQL Server 代理啟動,而是由其他一些調度程序任務啟動

創建一個新表,如下所示:

create table CaptureUnwantedJob
(
SQL_Command nvarchar(max),
SPID int,
Status nvarchar(125),
Command nvarchar(255),
ProgramName nvarchar(500)
)
go

創建一個將在早上 6:59 開始的新代理作業。將此查詢放入其中:

truncate table CaptureUnwantedJob

declare @i int = 1

while @i <= 10 
begin

   insert into CaptureUnwantedJob
   SELECT sqltext.TEXT,
   req.session_id,
   req.status,
   req.command,
   pr.program_name
   FROM sys.dm_exec_requests req
   join sys.sysprocesses pr on pr.spid = req.session_id
   CROSS APPLY sys.dm_exec_sql_text(req.sql_handle) AS sqltext

   set @i+=1

   -- wait another 10s before capturing again
   waitfor delay '00:00:10'

end

-- analyze the captured spids based on the PrgramName column -> it should look like something like this:
-- SQLAgent - TSQL JobStep (Job 0xF4CBD0F6534D9D49B28E15E15138ABD7 : Step x)
select * from CaptureUnwantedJob
where 
   ProgramName like '%SQLAgent%'

順便說一句,您將需要高度提升的權限-我相信是系統管理員角色的一部分-以便能夠查詢上述 3 個表。

下一步 - 我不知道有什麼腳本可以做到這一點,但在這裡你必須做一些手動工作 - 一旦你執行執行該 sp 的作業,它將採用以下格式:0xF4CBD0F6534D9D49B28E15E15138ABD7 - 獲取最後的 32 chars 並相應地放置“-”,以便您獲得有效的唯一標識符 -> 結果將是您正在尋找的 job_id:

select * 
from msdb.dbo.sysjobs 
where job_id = convert(uniqueidentifier,'F6D0CBF4-4D53-499D-B28E-15E15138ABD7')

祝你好運!

引用自:https://dba.stackexchange.com/questions/129067