Nhận id công việc HOẶC Tên công việc từ trong khi thực hiện công việc


12

Tôi có một DB trung tâm mà tôi viết kết quả công việc trên tất cả các máy chủ của tôi trở lại. Tôi chuyển 3 tham số qua powershell trong công việc SQL trở lại sp trên máy chủ trung tâm để xác minh công việc sẽ chạy vào thời điểm đó, v.v. Thông tin sau đó được hiển thị qua SSRS để chúng tôi có thể thấy một công việc thất bại / công việc chạy dài / & các công việc không chạy nhưng nên có (hoặc nếu ai đó làm hỏng lịch trình).

Để làm điều này, tôi có 2 bước công việc được thêm vào mỗi công việc trên mỗi máy chủ và tôi muốn giảm tập lệnh xuống chỉ còn 1 bước cho mỗi công việc..có thể gọi nó từ chia sẻ mạng ..

Nhưng vấn đề của tôi là một trong 3 thông số tôi vượt qua. Tôi cần phải nhận được lệnh thực thi hoặc tên công việc từ bên trong lệnh thực thi để tôi không phải mã hóa tham số tên. 3 thông số tôi vượt qua là jobid, status (thành công / thất bại), errormsg. Kịch bản powershell tôi đã viết là khá đơn giản.

Gọi invoke

Điều này viết những gì tôi cần để bàn. Tôi đã xem msdb.dbo.sp_help_job / msdb.dbo.sp_get_compoz_job_info / dbo.xp_sqlagent_enum_jobs / nhưng không ai trong số này sẽ đảm bảo tôi nhận được ID hoặc tên của công việc thực thi chính xác trong trường hợp có nhiều hơn 1 công việc thực thi cùng lúc.

Tôi thậm chí đã thử xem sys.sys Processes nhưng tôi nghĩ vì công việc tác nhân là tập lệnh powershell, nó hiển thị là ".Net SqlClient Data Carrier" vì vậy tôi không thể cắt JOBID nhị phân khỏi các công việc hiển thị là "SQLAgent - TSQL JobStep (Công việc 0xF1800243164745429C30474FFD5C990C: Bước 1) "--- điều này tôi đã học được từ bài viết của Denny cherry - cảm ơn denny-

Bất kỳ ý tưởng nào về cách lấy jobid thực thi sẽ được đánh giá rất cao.

Cảm ơn,

Chris

Câu trả lời:


19

Bạn sẽ phải sử dụng mã thông báo trong các bước công việc để có id công việc của riêng bạn. Chi tiết tại đây: Sử dụng mã thông báo trong các bước công việc .

Ở cuối bài viết có một ví dụ với jobid:

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

Tôi đã làm việc với các mã thông báo trước đó, nhưng đã từ bỏ chúng vì tôi không thể khiến chúng hoạt động chính xác với powershell. Bây giờ tôi đang gỡ lỗi. Cảm ơn hai bạn rất nhiều.
CleanFill 17/212

1

Để làm việc này, tôi đã sử dụng invoke-sqlcmdlệnh ghép ngắn trong powershell mặc dù là tác nhân sql. Sử dụng thông tin tôi nhận được ở trên, đây là những gì tôi nghĩ ra có tác dụng:

$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

Một phần có tôi là tôi phải thêm dòng này

$varname = $var.name

bởi vì nếu tôi không thêm cái này, biến ban đầu $ var sẽ chuyển trong tiêu đề system.data.datitable dài với tên cột của công việc, vì vậy nó đã khiến biến đó làm rối truy vấn trong thời gian chạy.

Hy vọng điều này có thể giúp người khác xuống đường.


0

Kiểm tra điều này:

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)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.