我有大约4台服务器(test1,test2,test3,test4),每台服务器有5到6个数据库。每个服务器都安排了大约60个SQL Server代理作业。
服务器内的每个作业都包含sql语句和SSIS包的组合。在SQL语句中,我们存储了procs,它从另一个服务器访问表。
现在我想检查服务器test2是否正在其他服务器的sql server agent作业中使用。
我尝试使用以下查询但无法获得任何结果
ValueTuple
但是当我在test1服务器中手动检查时,我可以看到在存储过程和ssis包中使用的test2服务器。
如何实现这一目标?
答案 0 :(得分:0)
这有点棘手。您需要单独搜索过程,文件系统和SQL Server。作业表仅包含入口点,而不是每个步骤的定义。
存储在SQL Server中的SSIS包
SSIS包存储在msdb表sysssispackages中。该定义存储在columnata列中。在您可以阅读/搜索数据之前,您需要投射数据。
-- How to read package data column.
SELECT TOP 10
[name],
packagedata AS [Before],
CAST(CAST(packagedata AS VARBINARY(MAX)) AS XML) AS [After]
FROM
sysssispackages
;
存储在文件系统上的SSIS包
这些是XML文本文件。您可以使用自己喜欢的方法进行搜索如果您想构建自己的解决方案.Net has some great file handling ablities。
存储过程
有几种方法,所有方法都从系统表中返回数据。一种方法是使用object definition function。
-- Returns definition of stored procedure.
SELECT
OBJECT_DEFINITION(OBJECT_ID(N'[Your-Schema].[Your-Procedure]'))
;
如果你想完全实现这一点
使用表sysjobsteps,您可以构建一个搜索给定服务器名称的包/应用程序。最终产品需要支持所有三种搜索方法。您可以使用子系统列来选择每个步骤应使用的搜索方法。