실행중인 작업에서 작업 ID 또는 작업 이름 가져 오기


12

모든 서버에서 작업 결과를 기록하는 중앙 DB가 있습니다. SQL 작업의 powershell을 통해 3 개의 매개 변수를 중앙 서버의 sp로 다시 전달하여 해당 시간에 작업이 실행되고 있는지 확인하는 등의 작업을 수행합니다. 그런 다음 SSRS를 통해 정보가 노출되어 작업 실패 / 장기 작업 / 실행되지 않았지만 가지고 있어야하는 작업 (또는 누군가 일정을 엉망으로 만든 경우)

이렇게하려면 모든 서버의 각 작업에 2 개의 작업 단계가 추가되어 있으며 각 작업에 추가 된 1 단계로 스크립트를 줄이려고합니다. 네트워크 공유에서 호출 할 수도 있습니다.

그러나 내 문제는 내가 전달하는 3 가지 매개 변수 중 하나입니다. 실행 작업 내에서 실행 jobid 또는 작업 이름을 가져와야하므로 name 매개 변수를 하드 코딩 할 필요가 없습니다. 내가 전달하는 3 개의 매개 변수는 jobid, status (success / fail), errormsg입니다. 내가 작성한 powershell 스크립트는 매우 간단합니다.

Invoke-sqlcmd -ServerInstance "MYRemoteSYSTEM"-데이터베이스 remoteDB -Query "exec dbo.JOB_LOG 'JOBNAME / ID', 'Success / FAIL', 'BAD MESSAGE HERE'"

이것은 내가 테이블에 필요한 것을 씁니다. 나는 msdb.dbo.sp_help_job / msdb.dbo.sp_get_composite_job_info / dbo.xp_sqlagent_enum_jobs /를 보았지만 이들 중 어느 것도 실행중인 작업이 2 개 이상인 경우 올바른 실행 작업의 ID 또는 이름을 얻지 못할 것입니다 동시.

sys.sysprocesses를 살펴 보았지만 에이전트 작업이 파워 쉘 스크립트이므로 ".Net SqlClient Data Provider"로 표시되므로 "SQLAgent-로 표시되는 작업에서 바이너리 JOBID를 잘라낼 수 없습니다. TSQL JobStep (Job 0xF1800243164745429C30474FFD5C990C : 1 단계) "--- Denny cherry의 포스트 에서 배웠 습니다 -감사합니다 denny-

실행중인 jobid를 얻는 방법에 대한 아이디어는 크게 감사하겠습니다.

감사,

크리스

답변:


19

자신의 작업 ID를 얻으려면 작업 단계에서 토큰을 사용해야합니다. 세부 사항 : 작업 단계에서 토큰 사용 .

이 기사의 끝 부분에는 jobid가 포함 된 한 가지 예가 있습니다.

SELECT * FROM msdb.dbo.sysjobs
WHERE @JobID = CONVERT(uniqueidentifier, $(ESCAPE_NONE(JOBID))) ; 

나는 이전에 토큰으로 작업하고 있었지만 powershell에서 올바르게 작동하지 못했기 때문에 포기했습니다. 지금 디버깅 중입니다. 대단히 감사합니다.
CleanFill

1

이 작업을 수행하기 위해 invoke-sqlcmdSQL 에이전트를 통해 powershell 에서 cmdlet을 사용하고있었습니다 . 위에서받은 정보를 사용 하여이 작업을 수행했습니다.

$var = Invoke-sqlcmd -Server "Server\Instance" -Query "select name from msdb.dbo.sysjobs WHERE job_id = CONVERT(uniqueidentifier, $(ESCAPE_SQUOTE(JOBID)))" -- This gives me the job name at runtime

$varname = $var.name -- here i have to put just the name into a variable

Invoke-sqlcmd -Server "server\instance" -Database "remote database" -Query "exec dbo.JOB_LOG $varname,'JOB STATUS HERE','LOG MESSAGE HERE';" 
--here I pass that to the remote system

나를 얻은 한 부분은이 줄을 추가해야한다는 것입니다.

$varname = $var.name

이것을 추가하지 않으면 초기 변수 $ var가 작업의 열 이름과 함께 system.data.datatable 헤더에 오랫동안 전달되므로 변수가 런타임에 쿼리를 엉망으로 만들었습니다.

이것이 다른 누군가를 도울 수 있기를 바랍니다.


0

이것을 확인하십시오 :

DECLARE @jobId BINARY(16)

SELECT @jobId = CONVERT(uniqueidentifier, job_id) FROM msdb.dbo.sysjobs
WHERE name = 'Your_Job_Name'

-2
DECLARE @jobname sysname, @jobid uniqueidentifier

SELECT @jobname=b.name,@jobid=b.job_id  
FROM sys.dm_exec_sessions a,msdb.dbo.sysjobs b
WHERE a.session_id=@@spid
AND 
(SUBSTRING(MASTER.dbo.FN_VARBINTOHEXSTR(CONVERT(VARBINARY(16), b.JOB_ID)),1,10)) = SUBSTRING(a.PROGRAM_NAME,30,10)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.