ההיכרות הראשונה שלי עם עולם המחשבים הייתה בתחילת שנות השמונים באוניברסיטה, עם שפת Basic: שורות הפקודות היו ממוספרות, לא הייתה רקורסיה, לא הייתה חובה להגדיר משתנים, והכי חשוב: בעזרת פקודת Goto שהייתה אחת מסימני ההיכר שלה ניתן היה לקפוץ ממקום למקום בקוד. כל זה גרם לכך ששמה של השפה הלך לפניה לרעה, וכחלופה המליצו על שפת פסקאל שהייתה הרבה יותר חינוכית..
מתברר שפקודת Goto חיה ובועטת ב-TSQL יחד עם עוד כמה פקודות שמאפשרות "לקצר הליכים" במקרה הצורך.
קטונתי מלפסוק הלכות, ולכל היותר אציע להשתמש בהן בזהירות ובחסכנות, ולהתנער מראש מכל אחריות משפטית לנזק שיגרם לקוראי בלוג זה..
נניח שכתבנו פרוצדורה ארוכה הכוללת שני חלקים, וניתן להריץ אותה באופן גמיש בהתאם לפרמטר המועבר אליה-
להריץ את שני החלקים או רק את החלק הראשון.
אפשרות אחת לבצע זאת היא להכניס את כל החלק השני תחת תנאי If כך שאם התנאי מתקיים – חלק זה יתבצע, ואם לא אז לא:
Create Proc MyProc @Flag Bit As
....
....
....
If @Flag=1
Begin
....
....
End
Go
פתרון כזה מסורבל במידת מה מכיוון שהוא הופך את כל החלק השני לבלוק תחום על ידי Begin & End וזה קצת מקשה על הבנת מבנה הפרוצדורה אם היא מאוד ארוכה, ויכולות להיות לו שתי חלופות:
Return – לפקודה זו שני שימושים עיקריים:
1. להחזיר ערך מהפרוצדורה למשתמש, שיציין אם היא הצליחה או נכשלה, או כל אינדיקציה אחרת.
למשל- פרוצדורה שיוצרת טבלה זמנית ומחזירה ערך כמה שורות הוכנסו לתוכה:
--פרוצדורה
Create Proc MyProc As
Select *
Into #T
From sys.objects;
Return @@RowCount;
Go
--הפעלה שלה
Declare @RC Int;
Exec @RC=MyProc;
Select @RC;
Go
2. לעצור את הריצה של הקוד ולסיים את הפרוצדורה.
Create Proc MyProc @Flag Bit As
....
....
....
If @Flag=0 Return;
....
....
Go
GoTo – לפקודת Return הנ"ל יש בעייה כאשר יש לצאת מהפרוצדורה בצורה מסודרת ולא סתם כך לסיים אותה. למשל- בתחילתה נפתחת טרזקציה שיש לסגור. במקרה כזה ניתן להשתמש בפקודת GoTo שתעביר אותנו היישר לקו הסיום:
Create Proc MyProc @Flag Bit As
Begin Transaction
....
....
....
If @Flag=0 Goto Sium
....
....
Sium:
Commit
Go
דוגמה טכנית להמחשה- שלוש פקודות Print, כשבעזרת GoTo מדלגים מעל השניה ומבצעים רק את הראשונה והשלישית:
Print 1
Goto Sium
Print 2
Sium:
Print 3
בנוסף לנ"ל יש שתי פקודות בקרת ריצה עבור לולאות:
Continue – "מקפיצה את הריצה לאיטרציה הבאה בלולאה, וכמו במקרה של Return חוסכת את הצורך ליצור בלוק If.
Break – מסיימת את הלולאה.
דוגמה טכנית להמחשה- לולאה רצה על כל המספרים מ-1 ועד 10 ומדפיסה אותם,
מדלגת על 3 על ידי Continue,
וב-8 יוצאת מהלולאה על ידי Break:
Declare @I Int;
Set @I=0;
While @I<10
Begin
Set @I=@I+1;
If @I=3 Continue
If @I=8 Break
Print @I;
End