משיב מוביל
הרצה של job מקובץ bat והחזרת ערך בסיום התהליך

שאלה
-
שלום,
יצרתי קובץ bat שמריץ job באמצעות sqlcmd, בסיום הריצה של ה- job אני מחזיר את %errorlevel%.
את הבדיקה לסיום ה-job אני מבצע בלולאה בקובץ bat בעזרת sp_help_job.
בפועל מה שקורה הוא שבכול מצב errorlevel=0, גם אם ה-job נכשל.
איך אני יכול להשפיע על errorlevel מהכישלון של ה-job או איזה פיתרון קיים כדי להחזיר אחד או אפס בהתאם לתוצאה של ריצת ה-job?
קיימת גרסת MSSQL2008
תודה רבה!!
תשובות
-
היי קובי,
ה error=0 שאתה מקבל הוא ההצלחה של sp_start_job, שאכן הצליח...
למיטב ידיעתי אין דרך לתקשר ישירות ולהעביר פרמטרים בין הג'וב עצמו ל BATCH הקורא.
אתה יכול לתעד את התוצאות של ה JOB בטבלה באחד ה STEPS ומתוך ה BATCH לתחקר את הטבלה.
Ami Levin, SQL Server MVP. CTO, DBSophic LTD. - http://www.dbsophic.com/ --Performance is the most significant driver in maintaining data and service availability.--
- הוצע כתשובה על-ידי haim fishner יום שני 21 מאי 2012 18:40
- סומן כתשובה על-ידי kobiat יום חמישי 24 מאי 2012 07:14
-
-
או שה-Control M יפעיל את ה-SSIS
או שג'וב יפעיל את ה-SSIS,
אבל שה-Control M יפעיל ג'וב והוא יפעיל את ה-SSIS - זה גם עקום, וגם אתה מפספס את יכולת הניהול של ה-Ctrl M: בעת במקום לדווח לך שהצליח להריץ את ה-SSIS הוא מדווח שהצליח להפעיל את הג'וב ואתה שובר את הראש ומחפש דרך לבדוק אם ה-SSIS סיים בהצלחה או לא.Blog: http://about.me/GeriReshef
- סומן כתשובה על-ידי kobiat יום חמישי 24 מאי 2012 07:15
כל התגובות
-
היי קובי,
ה error=0 שאתה מקבל הוא ההצלחה של sp_start_job, שאכן הצליח...
למיטב ידיעתי אין דרך לתקשר ישירות ולהעביר פרמטרים בין הג'וב עצמו ל BATCH הקורא.
אתה יכול לתעד את התוצאות של ה JOB בטבלה באחד ה STEPS ומתוך ה BATCH לתחקר את הטבלה.
Ami Levin, SQL Server MVP. CTO, DBSophic LTD. - http://www.dbsophic.com/ --Performance is the most significant driver in maintaining data and service availability.--
- הוצע כתשובה על-ידי haim fishner יום שני 21 מאי 2012 18:40
- סומן כתשובה על-ידי kobiat יום חמישי 24 מאי 2012 07:14
-
את הבדיקה האם הג'וב הצליח או נכשל יש לעשות בטבלאות המערכת של הג'ובים שנמצאות ב-msdb.
כתבתי פעם פתרון כללי לנושא שניתן להיעזר בו, או לקחת ממנו את מה שרלוונטי במקרה שלך:
http://blogs.microsoft.co.il/blogs/gerireshef/archive/2011/12/19/GR20111219.aspx
Blog: http://about.me/GeriReshef
- הוצע כתשובה על-ידי haim fishner יום שני 21 מאי 2012 18:41
-
היי,
אני מצטרף לתגובה של עמי לדעתי גם אין דרך לתקשר ישירות.
עמי כבר נתן פתרון ממש הולם, אבל אוליי אפילו אפשר אפילו להסתמך על טבלאות מערכת בMSDB ששומרות את המידע עבור הJOB'ים...
מצאתי פוסט ממש מתאים לדעתי, שמחזיר עבור כל הJOB'ים באינסטס את התוצאה הבאה:
ככה שאתה יכול לשלוף תמיד את המצב של הג'וב ובמידה והוא במצב Completed לשלוף את הLastRunOutCome...
הפוסט נמצא בקישור :
http://sqlconcept.com/2011/06/25/how-to-query-currently-running-sql-server-agent-jobs/
חיים פישנר.
-
כמה נקודות שאולי יעזרו לך:
* חבל שאתה לא מצרף לנו קודים (של ה BAT למשל וה JOB) כי זה היה נותן לנו יותר הבנה של המצב ורעיונות לפתרון.
1. ניתן ב JOB עצמו להריץ פקודות SHELL ולכן אין סיבה להריץ קובץ חיצוני ודרכו להריץ את ה JOB אלא הפוך. בתוך ה JOB מגדירים פקודות SHELL או אפילו הרצה של קובץ BAT ישירות מה JOB כך ש"סיום" ההרצה מהווה חלק מה JOB. במצב זה כישלון של פקודות ה SHELL יחזירו אל ה JOB שגיאה שניתן לאתר פשוט בבלוק של TRY.
exec master.sys.xp_cmpshell 'C:\test.bat'
2. אתה מקבל שגיאה 0 (ז"א אין שגיאה) מכיוון שכניראה ה JOB רץ טוב ולא חזרה שגיאה. מכיוון שאיננו יודעים מה אתה מריץ שם אני אוכל רק להציע פשוט ב JOB לא לבנות על שגיאה (שגיאה היא מצב לא תקין) למשל אם יש לך בלוק של TRY או משהו בסגנון ON ERROR אז כמובן שלא מתקבלת שגיאה בסיום אם היא "אופסה" במשך הרצת הגוב, לכן אני ממליץ יותר על החזרת ערך מוחשי.
3. ניתן לתקשר עם ה JOB לא רק בצורה ישירה אלא גם דרך SP שמפעיל אותו וכמו בכל SP אתה יכול להגדיר פרמטר חוזר בעזרת output וככה לתפוס את הערך של הפרמטר. אין בעיה "לדבר" עם ה JOB בצורה זו על ידי תוכנית חיצונית שתריץ את ה SP במקום את הג'וב ישירות ולהחזיר פרמטרים.
-- הרצה של ג'וב דרך פרוצדורה עם החזרת ערך ניתן לבצע למשל כך
--grab the return code from start_job like this
declare @return_code int
EXEC @return_code = msdb.dbo.sp_start_job @job_name='Audit'
if @return_code = 0 --SUCCESS
-- do some work
IF @return_code = 1 --FAILURE
--RAISE error here, do some work
-- וכאמור עם פרוצדורה אתה תמיד יכול לתקשר ישירות בצורה פשוטה
4. אם אתה נעול על הרצת ה JOB דרך ה SHELL ולא הפוך ופתרון קודם לא מספק אז אתה יכול תמיד לעבוד עם המחלקה ServerConnection. למחלקה ServerConnection ישנם כמה אפשרויות להרצת שאילתה כמו ExecuteNonQuery שהיא הדרך הנפוצה ביותר להריץ שאילתה כמו שאתה צריך אבל ישנם שיטות פחות נפוצות שגם מחזירות נתונים כמו הודעות שרת ושגיאות וזה יכול להתאים לך יותר כמו:
ExecuteWithResults, ExecuteWithResultsAndMessages וכו'
כאן יחזרו לך מה שנקרא מטאדטא (כאמור שגיאות ונתונים כמו הודעות שרת ולא רק התוצאה של שאילתה)* אני מאוד מציע למצרף יותר אינפורמציה אם עדיין לא הצלחת לפתור את הבעיה עם הנקודות האלו. צרף לנו את השאילתות והקודים שלך ואולי נוכל לעזור יותר
- נערך על-ידי pituachMVP, Moderator יום שני 21 מאי 2012 18:49
-
-
צודק :-) השימוש ב sp_start_job בודק למעשה אם ה JOB התחיל בהצלחה ולא אם סיים בהצלחה. טעות שלי
** שאילתה נחמדה מאוד בבלוג שכתבת גרי
- נערך על-ידי pituachMVP, Moderator יום שלישי 22 מאי 2012 05:38
-
המון תודות למענה המהיר!!!
המטרה בכללי היא הרצה של ג'ובים באמצעות Control-M ואינדיקציה בסיום הריצה של הג'ובים להמשך התהליך ב Control-M.
לא מצאתי דרך להוציא ל-Batch File את הערך הסטטוס שאני תופס בהרצה של sp_help_job, אני מחזיק את המידע בקוד SQL אבל אני לא מצליח לצאת מה BATCH עם הערך שתפסתי, מהדברים של עמי אני מבין שכנראה וגם אין דרך לעשות זאת.
אשמח לשמוע אם יש פתרונות אחרים להפעלת ג'ובים באמצעות Control-M, הפיתרון שעולה לי כרגע הוא לעבוד עם תכנית .NET קטנה שתעטוף את הפקודות ותחזיר ערך.
תודה רבה ויום טוב!!!
אני מצרף את הקוד שמצאתי והכנסתי בקובץ Bat:
SQLCMD -E -S ServerName -b -Q " DECLARE @JobStatus INTSET @JobStatus = 0 EXEC MSDB.dbo.sp_start_job @Job_Name = 'JobName' WAITFOR DELAY '00:00:01' SELECT @JobStatus = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'EXEC MSDB.dbo.sp_help_job @job_name = ''JobName'', @job_aspect = ''JOB'' ') WHILE @JobStatus <> 4BEGIN WAITFOR DELAY '00:00:03' SELECT @JobStatus = current_execution_status FROM OPENROWSET('SQLNCLI', 'Server=localhost;Trusted_Connection=yes;', 'EXEC MSDB.dbo.sp_help_job @job_name = ''JobName'', @job_aspect = ''JOB'' ') END "
-
הג'ובים של SQL Server הם כלי חביב ומועיל בתוך SQL Server- תזמון של תהליכים, הרצת תחזוקה בלילה וכו'.
אם רוצים לתזמן כלים אחרים ברמת המערכת- בשביל זה יש Control M - כלי חזק מאוד שכבודו במקומו מונח עם מסך למעקב אחר ריצת התהליכים, יכולת להפעיל מערכות שונות - לא רק SQL Server וכו'.
אין לי מושג למה מפעילים מתוך ה-Control M ג'וב של SQL Server, ויש לי הרגשה שפעם מישהו כתב ג'וב שמבצע תהליכים, מי שהחליף אותו החליט להעביר את התהליך ל-Control M כי קנו את זה בדיוק או כי הוא שמע שזה כלי יעודי לנושא; אבל במקום להפעיל מתוכו את הפרוצדורות שהג'וב מפעיל- הוא החליט בטעות להפעיל את הג'וב עצמו.
כעת אתה הגעת, קיבלת את זה בירושה, ומנסה איכשהו לפתור בעיות..
אפשר באקרובטיקה מקצועית למצוא פתרון, אבל למה לסבך את החיים? ה-Control M צריך להריץ פרוצדורות של SQL Server בעזרת SQLCmd (ולא ג'ובים), אתה תשב מול מסך הבקרה של המערכת ותוכל לראות בנחת איך צעד ראשון מופעל והופך לצהוב (אם אני זוכר נכון) וכשמצליח הופך לירוק, ואז צעד שני מתחיל וכך הלאה..
אחד הצעדים נכשל ונצבע באדום? אין בעייה- מתקנים את מה שצריך, ומתוך ה-Control M מפעילים את התהליך מהנקודה בה הוא נפל.Blog: http://about.me/GeriReshef
- הוצע כתשובה על-ידי Guy GlantserMVP, Moderator יום חמישי 24 מאי 2012 06:10
-
היי גרי, תודה על הדברים!
אין ספק שיותר נכון לרכז את התפעול תחת Control-M, אבל כמו שאמרת כבר קיימת מערכת עם ג'ובים שמריצים מארזי ssis ומופעלים ע"י batch files, אני מנסה לשכלל את החיבור הקיים בין הכלים.
באופן כללי, אתה חושב שלא נכון להתחבר ברמת הג'ובים אפילו שהם מספקים מעטפת טבעית להרצת רצף של תהליכים ב-ssis?
תודה
-
-
או שה-Control M יפעיל את ה-SSIS
או שג'וב יפעיל את ה-SSIS,
אבל שה-Control M יפעיל ג'וב והוא יפעיל את ה-SSIS - זה גם עקום, וגם אתה מפספס את יכולת הניהול של ה-Ctrl M: בעת במקום לדווח לך שהצליח להריץ את ה-SSIS הוא מדווח שהצליח להפעיל את הג'וב ואתה שובר את הראש ומחפש דרך לבדוק אם ה-SSIS סיים בהצלחה או לא.Blog: http://about.me/GeriReshef
- סומן כתשובה על-ידי kobiat יום חמישי 24 מאי 2012 07:15
-