2017-08-29 77 views
1

我有以下查詢來生成必要的命令,以禁用特定於某個類別的所有SQL代理作業。禁用特定類別中的所有SQL代理作業

Select 'Exec MSDB.dbo.sp_update_job @job_name = N''' + SJ.Name + ''', @Enabled = 0' 
    FROM msdb..sysjobs SJ inner join msdb..syscategories SC 
    on SJ.category_id = SC.category_id 
Where SJ.[Enabled] = 1 
    and SC.Name = 'BI ETLs' 

我怎麼能完全自動化這一點,所以它會產生的命令,沒有它是一個手動過程執行呢?

回答

1

你可以使用動態SQL:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = STUFF(( 
    SELECT ';' + 'Exec MSDB.dbo.sp_update_job @job_name = N''' 
      + SJ.Name + ''', @Enabled = 0' 
    FROM msdb..sysjobs SJ JOIN msdb..syscategories SC 
    ON SJ.category_id = SC.category_id 
WHERE SJ.[Enabled] = 1 
    and SC.Name = 'BI ETLs' FOR XML PATH('')),1 ,1, '') ; 

EXEC dbo.sp_executesql @sql; 

隨着SQL Server 2017它是非常容易使用STRING_AGG連接字符串:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = (Select STRING_AGG('Exec MSDB.dbo.sp_update_job @job_name = N''' + SJ.Name + ''', @Enabled = 0', ';') 
    FROM msdb..sysjobs SJ inner join msdb..syscategories SC 
    on SJ.category_id = SC.category_id 
Where SJ.[Enabled] = 1 
    and SC.Name = 'BI ETLs'); 

EXEC dbo.sp_executesql @sql;