2017-04-19 65 views
0

我有大約4個服務器(test1,test2,test3,test4)和每個服務器有5-6個數據庫。每個服務器都有約60個SQL Server代理作業計劃。在sql server代理作業中搜索鏈接的服務器名稱

服務器內部的每個作業都包含sql語句和SSIS包的組合。在SQL語句中,我們存儲了procs,它從另一臺服務器訪問表。

現在我想檢查服務器test2是否正在用於其他服務器的sql server代理作業。

我試着用下面的查詢,但沒能獲得任何結果

SELECT Job.name AS JobName, Job.enabled AS ActiveStatus, 
     JobStep.step_name AS JobStepName, JobStep.command AS JobCommand 
FROM sysjobs Job INNER JOIN 
    sysjobsteps JobStep 
    ON Job.job_id = JobStep.job_id 
WHERE JobStep.command LIKE '%test2%' 

,但是當我在test1的服務器手動檢查,我可以看到test2的服務器中存儲的特效和SSIS包使用。

這是如何實現的?

+0

SSIS包存儲在哪裏?在SQL Server中還是在文件系統上?如果SQL Server,每臺服務器上都有軟件包嗎? –

+0

軟件包存儲在服務器以及文件系統中。是的,所有服務器都有軟件包。 – 0537

回答

0

這有點棘手。您將需要分別搜索過程,文件系統和SQL Server。作業表只包含入口點,而不包含每個步驟的定義。

SSIS包,存儲在SQL Server

SSIS包存儲在msdbsysssispackages。該定義存儲在列封裝數據中。在讀取/搜索它之前,您需要投射數據。

-- 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,你可以建立一個封裝/應用程序,搜索一個給定的服務器名稱。最終產品需要支持所有三種搜索方法。您可能可以使用子系統列來選擇每個步驟應使用哪種搜索方法。