it-swarm.asia

الحصول على معرف الوظيفة OR اسم الوظيفة من داخل الوظيفة المنفذة

لدي قاعدة بيانات مركزية أكتب نتائج العمل على جميع خوادمي. أمرر 3 معلمات عبر powershell في مهمة SQL إلى sp على الخادم المركزي للتحقق من أن المهمة يجب أن تكون قيد التشغيل في ذلك الوقت ، وما إلى ذلك. يتم الكشف عن المعلومات عبر SSRS حتى نتمكن من رؤية فشل المهمة/المهام الطويلة الأمد/& الوظائف التي لم يتم تشغيلها ولكن يجب أن يكون لديها (أو إذا عبث شخص ما بجدول زمني).

للقيام بذلك ، لدي خطوتان وظيفيتان تمت إضافتهما في كل مهمة على كل خادم وأرغب في تقليل النص البرمجي إلى خطوة واحدة فقط مضافة إلى كل وظيفة ... وربما حتى استدعاها من مشاركة عبر شبكة ..

لكن مشكلتي هي واحدة من 3 معلمات أمررها. أحتاج إلى الحصول على اسم الوظيفة أو اسم الوظيفة المنفذة من داخل الوظيفة المنفذة ، لذا لا يلزمني أن أقوم بتثبيت معلمة الاسم. المعلمات الثلاث التي أمررها هي jobid ، الحالة (النجاح/الفشل) ، errormsg. إن نص Powerhell الذي كتبته واضح جدًا.

استدعاء 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/ولكن لن يضمن أي منها الحصول على معرف أو اسم مهمة التنفيذ الصحيحة في حالة وجود أكثر من وظيفة واحدة يتم تنفيذها في نفس الوقت.

لقد جربت حتى النظر في sys.sysprocesses ولكن أعتقد أن وظيفة الوكيل هي برنامج PowerSell ، فهي تظهر على أنها ".Net SqlClient Data Provider" لذا لا يمكنني قطع JOBID الثنائي من الوظائف التي تظهر كـ "SQLAgent - TSQL JobStep (المهمة 0xF1800243164745429C30474FFD5C990C: الخطوة 1) "--- لقد تعلمت من وظيفة Denny Cherry's - شكرًا جزيلاً-

سيكون موضع تقدير كبير أي أفكار حول كيفية الاستيلاء على جوبيد المنفذ.

شكر،

كريس

12
CleanFill

سيكون عليك استخدام الرموز المميزة في خطوات عملك للحصول على معرف الوظيفة الخاص بك. التفاصيل هنا: استخدام الرموز المميزة في خطوات العمل .

في نهاية المقال يوجد مثال واحد مع jobid:

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

لتشغيل هذا ، كنت أستخدم invoke-sqlcmd cmdlet في بوويرشيل على الرغم من وكيل 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 طويلًا مع اسم العمود الخاص بالمهمة ، لذا فقد تسبب في قيام المتغير بإفساد الاستعلام في وقت التشغيل.

أتمنى أن يساعد هذا شخصًا آخر على الطريق.

1
CleanFill

افحص هذا:

DECLARE @jobId BINARY(16)

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