รับ id ของงานหรือชื่องานจากภายในการดำเนินงาน


12

ฉันมีฐานข้อมูลกลางที่ฉันเขียนผลลัพธ์งานบนเซิร์ฟเวอร์ทั้งหมดของฉันกลับไป ฉันส่งพารามิเตอร์ 3 ตัวผ่าน powershell ในงาน SQL กลับไปที่ sp บนเซิร์ฟเวอร์กลางที่ตรวจสอบว่างานควรจะทำงานในเวลานั้น ฯลฯ ข้อมูลจะถูกเปิดเผยผ่าน SSRS เพื่อให้เราเห็นงานล้มเหลว / งานที่ต้องทำงานนาน / & งานที่ไม่ได้ทำงาน แต่ควรมี (หรือถ้ามีคนยุ่งกับตาราง)

ในการทำเช่นนี้ฉันมี 2 ขั้นตอนงานในแต่ละงานบนเซิร์ฟเวอร์ทุกเครื่องและฉันต้องการลดสคริปต์ลงเหลือเพียง 1 ขั้นตอนในแต่ละงาน .. อาจเป็นไปได้ที่จะโทรหาจากเครือข่ายที่ใช้ร่วมกัน ..

แต่ปัญหาของฉันคือหนึ่งในสามพารามิเตอร์ที่ฉันผ่าน ฉันต้องการรับ jobid ที่กำลังเรียกใช้หรือชื่องานจากภายในงานที่กำลังดำเนินการดังนั้นฉันไม่ต้อง hardcode พารามิเตอร์ name 3 พารามิเตอร์ที่ฉันผ่านคือ jobid สถานะ (สำเร็จ / ล้มเหลว), errormsg สคริปต์ powershell ที่ฉันเขียนนั้นค่อนข้างตรงไปตรงมา

เรียกใช้-sqlcmd -ServerInstance "MYRemoteSYSTEM" - ฐานข้อมูล remoteDB - แบบสอบถาม "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 / แต่ไม่มีสิ่งใดที่จะรับประกันได้ว่าฉันได้รับ ID หรือชื่อของงานที่ถูกต้องในกรณีที่มีงานมากกว่า 1 งาน ในเวลาเดียวกัน

ฉันเคยลองดูที่ sys.sysprocesses แต่ฉันคิดว่าเนื่องจากงานตัวแทนเป็นสคริปต์ PowerShell ก็แสดงเป็น ".Net SqlClient Data Provider" ดังนั้นฉันจึงไม่สามารถตัด JOBID ไบนารีออกจากงานที่แสดงเป็น "SQLAgent - TSQL JobStep (งาน 0xF1800243164745429C30474FFD5C990C: ขั้นตอนที่ 1) "--- สิ่งนี้ฉันเรียนรู้จากโพสต์ของ Denny cherry - ขอบคุณ denny-

ความคิดใด ๆ เกี่ยวกับวิธีการคว้า jobid การดำเนินการจะได้รับการชื่นชมอย่างมาก

ขอบคุณ

คริส

คำตอบ:


19

คุณจะต้องใช้โทเค็นในขั้นตอนงานของคุณเพื่อรับรหัสงานของคุณเอง รายละเอียดที่นี่: ใช้โทเคนในขั้นตอนการทำงาน

ในตอนท้ายของบทความมีตัวอย่างหนึ่งกับ jobid:

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

ก่อนหน้านี้ฉันทำงานกับโทเค็น แต่ก็ละทิ้งพวกเขาเพราะฉันไม่สามารถทำงานได้อย่างถูกต้องกับพาวเวอร์เชล ฉันกำลังดีบั๊กตอนนี้ ขอบคุณทั้งคู่มาก ๆ
CleanFill

1

เพื่อให้สิ่งนี้ใช้งานได้ฉันใช้invoke-sqlcmdcmdlet ใน powershell ผ่านตัวแทนของ sql จากการใช้ข้อมูลที่ฉันได้รับข้างต้นสิ่งที่ฉันได้รับคือ:

$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 ยาวกับชื่อคอลัมน์ของงานดังนั้นมันจึงทำให้ตัวแปรสับสนแบบสอบถามในเวลาทำงาน

หวังว่าสิ่งนี้จะช่วยคนอื่นตามท้องถนน



-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.