2008-11-18 12 views
5

मेरे पास कई नौकरियां हैं जिनके पास लोगों की सूची में 1 विशिष्ट ईमेल भेजने का एक कदम है। रेसिपीटर की उस सूची को चरण कमांड में हार्डकोड किया गया है और मुझे सभी नौकरियों में उस सूची से एक व्यक्ति को हटाने की आवश्यकता है।सभी एसक्यूएल सर्वर एजेंट नौकरियों में नौकरी चरण कमांड में थोक-संशोधन कैसे करें

मैं एसक्यूएल सर्वर एजेंट में सभी नौकरियों के माध्यम से कैसे लूप करूं और टेक्स्ट के विशिष्ट टुकड़े को प्रतिस्थापित करने के लिए कमांड टेक्स्ट को संशोधित करूं।

मैं एसक्यूएल सर्वर 2005 का उपयोग कर रहा हूं और पहले से ही sp_update_jobStep पर देखा है लेकिन मैं बिल्कुल वही नहीं दिखता हूं जो मैं चाहता हूं।

चीयर्स।

उत्तर

5

आप सिस्टम टेबल को अद्यतन करने का प्रयास कर सकते हैं जो SQL सर्वर की नौकरियों पर सीधे जानकारी रखती है। आप के लिए प्रासंगिक लोगों होगा:

msdb.dbo.SysJobs 
msdb.dbo.SysJobSteps 

आप हटाने के लिए एक विशिष्ट ईमेल पते है, तो आप कमान क्षेत्र SysJobSteps तालिका के एक ही अद्यतन बयान के साथ अद्यतन कर सकते हैं।

UPDATE SJS SET 
    Command = REPLACE(Command, 'EmailAddress&TestDomain.Com', '') 
FROM msdb.dbo.SysJobs SJ 
INNER JOIN msdb.dbo.SysJobSteps SJS 
    ON SJS.Job_Id = SJ.Job_Id 
WHERE SJ.Originating_server = ..... -- Your server here 
    AND SJS.Command LIKE '%[email protected]%' 

यह पहली बार एक SELECT कथन के रूप में ऊपर क्वेरी चलाने के लिए, यह केवल काम रिटर्न कदम अपने अद्यतन करने के लिए उम्मीद कर रहे हैं परीक्षण करने के लिए उचित होगा।

0

यदि कोई अभी भी इसके लिए खोज कर रहा है तो नीचे करना चाहिए। बेहतरीन कोड नहीं है लेकिन काम पूरा हो जाता है।

/* 
Replace the below statement with the actual keyword to be replaced: 
INSERT INTO SP_Keyword VALUES 
('sys.databases3', 'sys.databases5') 
,('sysjobs3', 'sysjobs5') 

Here we are replacing sys.databases3 and sysjobs3 
with sys.databases5 and sysjobs5 respectively. 

Script only searches in 'TSQL', 'Powershell', 'CMDEXEC' job type. 
*/ 

SET NOCOUNT ON 

use msdb 
GO 

DECLARE @OldV VARCHAR(max) 
DECLARE @NEWV VARCHAR(max) 
DECLARE @job_id2 varchar(max) 
DECLARE @step_id2 varchar(10) 
DECLARE @command2 varchar(max) 
DECLARE @command3 varchar(300) 

--CLEANUP TASKS 
IF EXISTS(SELECT * FROM sys.tables where name = 'SP_Keyword') 
    DROP TABLE SP_Keyword 

CREATE TABLE SP_Keyword 
(
old_keyword varchar(200), 
new_keyword varchar(200) 
) 

--DEBUG STATEMENT 
--PRINT 'SP_Keyword TABLE CREATED' 

INSERT INTO SP_Keyword VALUES 
('sys.databases3', 'sys.databases5') 
,('sysjobs3', 'sysjobs5') 

--DEBUG STATEMENT 
--PRINT 'VALUES INSERTED FOR KEYWORD' 

CREATE TABLE #jobs(
    [name] [sysname] , 
    [step_name] [sysname] , 
    [subsystem] [varchar](40) , 
    [command] [varchar](max) , 
    [keyword] [varchar](200) , 
    [database_name] [sysname] , 
    [enabled] [tinyint] , 
    [description] [varchar](512) , 
    [date_created] [datetime] , 
    [job_id] [uniqueidentifier] , 
    [step_id] [int]  
) 

DECLARE db_cursor3 CURSOR FOR 
SELECT old_keyword FROM SP_Keyword 
    OPEN db_cursor3 
    FETCH NEXT FROM db_cursor3 INTO @OldV 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     INSERT INTO #jobs 
     SELECT a.name as job_name, b.step_name, b.subsystem, 
     b.command, @OldV as 'keyword', b.database_name, a.enabled, 
     a.description, a.date_created, b.job_id, b.step_id 
     FROM [dbo].[sysjobsteps] as b 
     INNER JOIN sysjobs as a 
     ON a.job_id = b.job_id 
     WHERE [command] LIKE '%'[email protected]+'%' 
     AND [subsystem] IN ('TSQL', 'Powershell', 'CMDEXEC') 

     FETCH NEXT FROM db_cursor3 INTO @OldV 
    END 

    CLOSE db_cursor3 
    DEALLOCATE db_cursor3 

IF NOT EXISTS(SELECT * FROM #jobs) 
    BEGIN 
    PRINT 'NO JOBS FOUND TO BE REPLACED' 
    GOTO SKIPPER 
    END 
--SELECT name as job_name, step_name, command, keyword, database_name, enabled, description, date_created FROM #jobs 

    DECLARE db_cursor3 CURSOR FOR 
    SELECT * FROM SP_Keyword 

    OPEN db_cursor3 
    FETCH NEXT FROM db_cursor3 INTO @OldV,@newV 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     UPDATE #jobs SET command=REPLACE(command,@oldV,@NewV) 
      WHERE command LIKE '%'[email protected]+'%' 
      FETCH NEXT FROM db_cursor3 INTO @oldV,@NewV 
    END 

    CLOSE db_cursor3 
    DEALLOCATE db_cursor3 

    print 'COMMAND TO REPLACE JOB STEPS IS BEING EXECUTED' 

    DECLARE db_cursor3 CURSOR FOR 
    SELECT job_id, step_id, command FROM #jobs 

    OPEN db_cursor3 
    FETCH NEXT FROM db_cursor3 INTO @job_id2,@step_id2, @command2 

    WHILE @@FETCH_STATUS = 0 
    BEGIN 
     SET @command3 = 'sp_update_jobstep @job_id = '''[email protected]_id2+''' ,@step_id = '[email protected]_id2+', @command = '''[email protected]+'''' 
     PRINT @command3 
     EXEC(@command3) 
     FETCH NEXT FROM db_cursor3 INTO @job_id2,@step_id2, @command2 
    END 

    CLOSE db_cursor3 
    DEALLOCATE db_cursor3 

SKIPPER: 
DROP TABLE #jobs 
DROP TABLE SP_Keyword 
PRINT 'CLEANUP DONE' 
PRINT 'PROGRAM COMPLETE' 
संबंधित मुद्दे