שימוש בפונקציה DateAdd בסופי חודשים

30/05/2012

הפונקציה DateAdd מאפשרת לנו להוסיף או להחסיר פרקי זמן מתאריך נתון- החל מאלפיות שנייה וכלה בשנים. בדרך כלל ההתנהגות של הפונקציה צפויה והגיונית, אלא אם כן מדובר בתוספת של חודשים / רבעונים / שנים לתאריכים שנמצאים בסוף חודש או בסמוך אליו. במה דברים אמורים? נניח שנוסיף חודש לתאריך 30/04/2012, לאיזה תאריך נגיע- ל-30/05/2012 או ל-31/05/2012? לחילופין- אם נוסיף חודש לתאריך 31/05/2012 – נגיע ל-30/06/2012 או ל-01/07/2012? נבדוק מספר מקרי קצה בעייתיים: If Object_ID('tempdb..#T','U') Is Not Null Drop Table #T; ...
אין תגובות

קיבוץ תאריכים לפי ימים ושעות

22/05/2012

נתונה טבלת לוג של פעולות ואנחנו מעוניינים לקבל סיכומים ברמה של ימים וחלקי ימים (למשל- שעות שלמות, אך לא רק). הכיצד? (אני מניח שבכל שורה יש תאריך אירוע הכולל גם שעה, דקה וכו') נתחיל מחילוץ התאריך השלם- מגרסת 2008 ניתן להפוך את התאריך ל-Date שזה סוג הנתון המתאים למקרה זה; ואילו חובבי הנוסטלגיה הנשארים נאמנים לגרסאות קודמות יבדקו כמה ימים חלפו מתחילת הספירה (למניין מיקרוסופט) ויהפכו את זה לתאריך: Select create_date, Cast(create_date As Date) , ...
אין תגובות

מחולל סקריפטים של אינדקסים

17/05/2012

קצת קשה לקבל פקודות ליצירת טבלאות או אינדקסים: כל עוד מדובר בפרוצדורות, פונקציות, טריגרים, ו-Views – ניתן לקבל את הקוד המלא בקלות; אך בכל מה שקשור לטבלאות ואינדקסים – המידע רובו זמין בטבלאות המערכת, אך את פקודות ה-Create יש ליצור לבד באמצעות קוד; וזו גם משימה מסובכת וגם סיזיפית מכיוון שבכל גרסה מתווספות אופציות חדשות ויש לעדכן את הקוד. לאחרונה התקנתי את SQL Search של Red Gate – תוסף חינמי שאני ממליץ עליו ושמאפשר לחפש בקלות מחרוזות בקודים ובאובייקטים של המערכת (לא בתוכן של הטבלאות!). אם הכלי מצא את המחרוזת בפרוצדורה – הוא מציג אותה בתחתית...
תגיות: , , , ,
אין תגובות

שימוש ב-Compression

10/05/2012

אופציית ה-Compression (כיווץ) התווספה ב-SQL Server 2008, אך רק בגרסאות Enterprise Edition (מעוטי היכולת פטורים איפוא מלקרוא את המשך הפוסט). הכיווץ מתבצע הן ברמת הדיסק והן ברמת הדכרון הפנימי, וכך הנתונים תופסים פחות מקום, פחות פעולות IO יקרות, פחות קריאה מהזכרון, אבל יותר שימוש ב-CPU. מכיוון שבדרך כלל פעולות ה-IO הן היקרות ביותר (מכיוון שמדובר בפעולות מכניות ולא אלקטרוניות) ו-SQL Server הוא זולל משאבי זכרון בלתי נלאה- הרווח הגדול שלנו בשני הסעיפים עולה לנו בגידול זניח ב-CPU שלרוב אינו מהווה צוואר בקבוק. קצת מזכיר את השימוש באינדקסים- שיפור בביצועים מצד אחד וגידול בעלויות האחסון...
אין תגובות

כיצד מתנהגת עמודת Identity בעת פעולת Insert ממספר מקורות?

09/05/2012

בפורום בסיסי נתונים בתפוז הופיעה שאלה- כיצד לזהות או לשלוף את ערכי ה-Identity שהוכנסו בפעולת ה-Insert האחרונה. כל עוד מדובר בערך בודד- ניתן להשתמש במשתנה המערכת @@Identity, אך מה קורה כשמדובר במספר ערכים? חשבתי לתומי שניתן להיעזר ב-@@Identity הנ"ל וב-@@RowCount המציין כמה שורות התווספו באותה פעולת Insert וכך לשלוף במישרין (על ידי Select Top ומיון הפוך) או לחשב בעקיפין (בהינתן ה-Increment של ה-Identity) את הערכים, אל שנאמר לי (ובצדק כפי שהתברר לי בדיעבד) שאם הטבלה תעודכן בו זמנית משני מקורות שונים זה לא יעבוד. האומנם? – תהיתי – הרי כל פעולת...
אין תגובות

תחליפים ל-IsNumeric

04/05/2012

פונקציית IsNumeric מחזירה 0 למחרוזות שלא ניתן להפוך למספר ו-1 למחרוזות שכן, וכך היא מאפשרת למשל למצוא חריגים בנתונים שנקלטים מקבצי טקסט. הבעייה בפונקציה שיש לה הגיון פנימי משלה שנקבע על ידי מי שתכנת אותה, וזה לא תמיד ההגיון שלנו. למשל (ותודה ל-PITOACH ול-rnan מפורום בסיסי נתונים בתפוז)- Select IsNumeric('$') , IsNumeric('1D8') , ...
3 תגובות