פעולות חיתוך ואיחוד בין קבוצות וביצוע Union בעזרת Join

28/02/2011

דרך מעניינת להסתכל על טבלאות היא כעל קבוצות של רשומות. נכון שהדימוי האינטואיטיבי הוא דווקא של רשימה מסודרת (טבלה..) אבל לסדר אין חשיבות והטבלה נשארת אותה טבלה ללא קשר לאופן המיון הלוגי או הפיזי של הרשומות (זו כנראה אחת הסיבות להתעקשותה של Microsoft לא לאפשר ביצוע Order By ב-View), ובין טבלאות ניתן לבצע פעולות חיתוך ואיחוד כפי שלמדנו במבוא לתורת הקבוצות.. לצורך ההמחשה ניצור שתי טבלאות בעלות מבנה זהה, ונכניס לתוכן נתונים - חלקם זהים וחלקם שונים: Use tempdb; Go ...

לכידת פלט פרוצדורה

24/02/2011

כשאנחנו מריצים קוד ב-SSMS הפלט שלו מופנה בדרך כלל ללשוניות ה-Results (פלט של שאילתות Select) וה-Messages (הודעות מערכת, פקודות Print ו-RaisError): את הפלט הזה אנחנו רוצים לקלוט- לצרכי מעקב או לשם עיבוד, ויש לכך דרכים שונות - חלקן מוכרות וברורות מאליהן (למשל להעתיק אותן ידנית מה-SSMS ל-Excel) וחלקן פחות מוכרות ונועדו למקרים מיוחדים. את הפלט בלשונית ה-Messages נרצה לשמור בדרך כלל בגלל פקודות Print ששילבנו בקוד לשם מעקב ו-Debug, ובגלל דיווחים אוטומטיים של המערכת כמו הודעות שגיאה - אם יש, וכדומה. את הפלט ניתן כאמור להעתיק ידנית, לשמור לקובץ על ידי קליק ימני ובחירה באופציה...
תגיות: , ,
תגובה אחת

דרך נוחה לעיון בקוד של פרוצדורות ואובייקטים אחרים

17/02/2011

לפני מספר חודשים כתבתי פוסט על דרכים לעיון בקוד של פרוצדורה (חוץ מאשר למצוא אותה בצד שמאל ב-SSMS ולהציג את הסקריפט על ידי קליק ימני), ומצאתי בינתיים עוד דרך נחמדה שמשלבת שליפה של כל האובייקטים (מה שמאפשר למיין ולסנן על פי הצורך) ומעבר נוח לתצוגה של הסריפט: Select id, Object_Name(id) Object, ObjectPropertyEx (id, N'BaseType') ObjectType, ...
תגיות: , ,
אין תגובות

פקודות בקרת ריצה (Control of Flow)

16/02/2011

ההיכרות הראשונה שלי עם עולם המחשבים הייתה בתחילת שנות השמונים באוניברסיטה, עם שפת Basic: שורות הפקודות היו ממוספרות, לא הייתה רקורסיה, לא הייתה חובה להגדיר משתנים, והכי חשוב: בעזרת פקודת Goto שהייתה אחת מסימני ההיכר שלה ניתן היה לקפוץ ממקום למקום בקוד. כל זה גרם לכך ששמה של השפה הלך לפניה לרעה, וכחלופה המליצו על שפת פסקאל שהייתה הרבה יותר חינוכית.. מתברר שפקודת Goto חיה ובועטת ב-TSQL יחד עם עוד כמה פקודות שמאפשרות "לקצר הליכים" במקרה הצורך. קטונתי מלפסוק הלכות, ולכל היותר אציע להשתמש בהן בזהירות ובחסכנות, ולהתנער מראש מכל אחריות משפטית לנזק שיגרם לקוראי בלוג זה.....
אין תגובות

חשבתי לתומי שאני יודע הכל על Left Join

15/02/2011

איזהו חכם? הלומד מכל אדם: אריאל ממקום עבודתי שאל אותי לגבי Left Join, והופתעתי לגלות פינה שלא הייתי מודע לה- בזכותו. דוגמה קצרה- ניצור טבלת עובדים וטבלת ישובים, ונכניס לתוכן נתונים: Use tempdb; Go   Create Table T_Ovdim(Oved Varchar(20) Primary Key, Yishuv Int, ...
2 תגובות

פונקציה המחזירה מספר ערכים

12/02/2011

אני מעוניין בפונקציה שתקבל כפרמטר תאריך לידה, ותחזיר את הגיל (מספר), יום הלידה בשבוע (טקסט), והיום הראשון בשנת הלידה (תאריך). כיצד נעשה זאת? פתרון- באמצעות Table-Valued Function שתחזיר טבלה בת רשומה אחת: Create Function dbo.MyFunc(@D DateTime) Returns Table As Return (Select DateDiff(Year,@D,GetDate()) Age, DateAdd(Day,-DatePart(DayOfYear,@D)+1,@D) YearBegin, ...
אין תגובות

קליטת תאריכים מתוך טקסט

08/02/2011

בעבר כתבתי על כך שראוי שתאריכים יכתבו בצורה סטנדרטית, למשל התאריך של היום ראוי שיכתב בתור '20110208' כדי שלא יהיה ספק שמדובר בשמונה בפברואר ולא בשניים באוגוסט. אם לעומת זאת נכתוב '2010-02-08' בשפות שונות הוא יובן באופנים שונים, כאשר השפה היא בראש ובראשונה שפת ברירת המחדל של השרת, מעליה שפת ברירת המחדל של ה-Login (אם היא שונה מזו של השרת- היא גוברת עליה), ומעל כולם השפה שהגדרנו ל-Session שפתחנו (בדרך כלל כולן זהות לזו של השרת ואין כל בעייה). יחד עם זאת יש מקרים בהם התאריכים מתקבלים בצורה לא סטנדרטית, ו-SQL Server מגלה גמישות רבה בנכונותו לתרגם...
אין תגובות

המרה בין ערכים דצימליים והקסדצימלים ומיון ערכים מספריים

06/02/2011

מעולם לא הזדקקתי לבסיס הספירה ההקסדצימלי בסופרמרקט או בחדר הכושר, אבל יוצא לי להיתקל בו פה ושם בטבלאות מערכת, ומכיוון שאין לדעת אל נכון מתי אזדקק לשירותיו- אני כבר מקדים רפואה למכה.. להלן דוגמה מדורגת כיצד מתרגמים 500 לערך הקס דצימלי: With T As (Select 500 , Cast(500 As Varbinary(Max)) , master.dbo.FN_VarbinToHexStr(Cast(500 As Varbinary(Max))) , ...

החלפת מחרוזת אחת באחרת בתוך קוד פרוצדורה

05/02/2011

לשולחן המערכת הגיעה השאלה הבאה: יש צורך בסקריפט שיאפשר לתקן פרוצדורות כך שמחרוזת המופיעה בהן תוחלף באחרת. למשל: Create Proc MyProc As Select * From sys.objects Where name Like '%A%'; Go פרוצדורה זו שולפת את כל האובייקטים שבשמם מופיעה האות A, ואנחנו רוצים שתשלוף את אלו שבשמם מופיעה האות B.. טוב, זו דוגמה קצת מטופשת, אבל נניח שבמציאות מדובר במשהו יותר מורכב, ונקבל כאקסיומה שהלקוח...
אין תגובות