get error description

flenger

New member
get error description

שלום לכולם
אני רוצה לדעת אם יש דרך נוספת לקבל את המידע שמגיע מSQL SERVER על שגיאות שנעשו במהלך הSCRIPT
במידה ועוטפים את הSCRIPT ב TRY CATCH ניתן להשיג את המידע הרצוי

SELECT ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage;

אבל במידה ואני מבצע את הSCRIPT שלי בתוך TRANSACTION רק הERROR זמין
צרפתי את הSCRIPT לצורך הדוגמא

תודה לעוזרים
 

pitoach

New member
בלוק TRY יחזיר רק את השגיאה האחרונה דרך אגב

בדרך כלל שגיאה כוללת 2 הודעות ואתה תקבל רק את האחרונה

תבדוק אם הקישור הבא עוזר לך:
http://sqlblog.com/blogs/maria_zakourdaev/archive/2012/06/06/is-your-try-worth-catching.aspx
הרעיון הוא להישתמש ב xp_cmdshell כדי להריץ את הפרוצדורה או השאילתה כך שכל הודעות השגיאה יחזרו.
באופן דומה ניתן לעבוד עם CLR
 

flenger

New member
את השימוש בTRY אני מכיר

פשוט חשבתי שיש דרך נוספת לא דרך BLOCK TRY
כמו שאתה מריץ את הסריפט באופן רגיל וSQL אומר לך בכל שורה מה הייתה הבעיה/בעיות

בכל מקרה לפחות כרגע פשוט מכל סיבה שיש שגיאה אני עושה ROLLBACK

תודה על העזרה
 

flenger

New member
שאלה נוספת

אם יש לי סקריפט ארוך
ואני רוצה לדעת אם הייתה בו בעיה כל שהיא כי כרגע אם יש בעיה הוא ממשיך לבצע את שאר הפקודות ובמידה והן בסדר..
הבעיה שהייתה "נעלמת"
 

pitoach

New member
זו דרך אחת אבל כם TRY CATCH היה נותן פתרון זה

זו דרך אחת אבל כם TRY CATCH היה נותן פתרון זה

אם נמשיך את הדוגמה בקישור שהבאת
נגדיר את ה XACT_ABORT שוב לברירת המחדל שלו OFF
ונכניס את כל הקוד לבלוק TRY
שים לב שבסיום ה TRY אני מבצע את ה COMMIT ז"א ה COMMIT יתבצע רק אם כל הבלוק הצליח.
גם במקרה זה הפעולות לא יבוצעו בגלל שהן בתוך בלוק TRY ויש שם פקודה אחת שמכשילה הכל

SET XACT_ABORT OFF;
GO
BEGIN TRANSACTION;
begin try
INSERT INTO t2 VALUES (10);
INSERT INTO t2 VALUES (20); -- Foreign key error.
INSERT INTO t2 VALUES (30);
COMMIT TRANSACTION;
end try
begin catch
rollback TRANSACTION
end catch
GO

בכל מקרה הפתרון שמצאת יפה

זה מתאים הרבה יותר לעבודה עם אפליקציה חיצונית ועבודה עם טרנזקציה נסתרת (כל פעולה מבוצעת בטרנזקציה אבל בדרך כלל אנחנו לא מגדירים במפורש טרנזקציה כמו שאילתה של אפליקציה שנשלחת ישירות למסד הנתונים... אלו נחשבות טרנזקציות לא מפורשות)
 
למעלה