פונקציית המחרוזת Stuff

27/12/2010

בעוונותי הרבים לא הכרתי את הפונקציה הזו עד לאחרונה, ומאז אני עושה בה שימוש רב. הפונקציה משלימה את Replace, כאשר במקום להחליף תת מחרוזת ספציפית אחת באחרת - לא משנה מה מיקומה, היא מחליפה תת מחרוזת לא ספציפית אחת באחרת - אך במקום מסויים. למשל- בכתיבת SQL דינאמי אני נדרש לעיתים לשרשר את שמות כל העמודות של טבלה כלשהי כדי ליצור פקודת Insert Into, כמובן- עם פסיקים בין שמות העמודות. למשל: Declare @SQL Varchar(Max); Set @SQL=''; Select @SQL=@SQL+','+name From sys.columns Where Object_name(Object_Id)...
תגיות: , ,
אין תגובות

חסכו ואמצו: Sparse Columns

26/12/2010

Sparse Columns הוא בשורה שגרסת SQL 2008 הביאה עמה לפני כשנתיים: עמודות שרובן Nulls (כלומר- מאוכלסות בפועל במעט מאוד ערכים) יכולות להיות מוגדרות כ-Sparse Columns ואז הן תחסוכנה מקום שכן לא יוקצה שטח אחסון ל-Nulls אלא לערכים אמיתיים בלבד. נבדוק במה דברים אמורים- ניצור שתי טבלאות עם עמודת Int - בראשונה נגדיר אותה כ-Sparse ובשניה לא, לשתיהן נוסיף 100,000 שורות, ואולי אף נגזים ולעמודת ה-Sparse נכניס Nulls ולעמודה שאינה Sparse נכניס מספרים, ונבדוק כמה זה עולה לנו: Use tempdb; Go   ...
4 תגובות

טרנזקציות ופעולות DDL

23/12/2010

טרנזקציות מקושרות בתודעתנו לפעולות DML (שינויים בנתוני הטבלאות): אם בתוך הטרנזקציה הוספנו, שינינו, מחקנו וכו', ולבסוף ביצענו Rollback - כל השינויים מתבטלים ואנחנו חוזרים לנקודת ההתחלה. ב-SQL Sever הטרנזקציות משפיעות גם על פעולות DDL (שינויים במבני טבלאות): יצירת אובייקטים, ביטול אובייקטים ושינוי אובייקטים. כך למשל פעולת -Truncate Table שהיא בעצם יצירה מחדש של הטבלה - המתבצעת בתוך טרנזקציה, תתבטל במקרה של Rollback. הייתה לי היום תזכורת מעט משעשעת (בדיעבד) לכך- אני כותב פרוצדורה מורכבת הכוללת שימוש בטבלאות זמניות בעזרת SQL דינאמי, ומכיוון שטבלאות זמניות פרטיות (בעלות #סולמית בודדת) נמחקות בסיום הפרוצדורה - במהלך הפיתוח אני משתמש בפרוצדורות...

שימוש בפונקציות חלון בשאילתות Group By

22/12/2010

פונקציות חלון מאפשרות לנו להוסיף לשליפה רגילה עמודה עם סיכומים מבלי לבצע Group By - פעולה שמקבצת נתונים ואינה מחזירה את ה-Set המקורי. ניתן לשלב בין השתיים מבלי להזדקק לשאילתות משנה, אבל בזהירות מכיוון שפונקציות החלון פועלות על הסט המקובץ, ואנו עלולים לקבל תוצאות שונות ממה שתכננו.. בפוסט Calculate Percentage in SQL Server מציג שיטה לחישוב אחוזים בשאילתת Group By: ביצענו סיכום לפי ציונים, וכדי לדעת את חלקו של כל ציון בסה"כ יש לחלק את מספר הציונים בכל קבוצה בסה"כ הציונים; כלומר- לבצע פעם Count של Group By לפי קבוצה ופעם Count כללי כפונקציית חלון. המחבר...
תגיות: , ,
אין תגובות

השימוש ב-Surrogate Key (SK) – יתרונות וחסרונות

16/12/2010

יצרנו טבלת עובדים. באיזו עמודה נבחר בתור ה-Primary Key שלה, הנתון שיצביע באופן חד משמעי על העובד בטבלאות המקושרות כ-Foreign Key (ביחס 1:N) או בחיפוש בטבלה? אפשרות שמן הסתם תיפסל מראש היא להשתמש בשם ובשם הפרטי, מכיוון שהם אינם יחודיים בהכרח. אפשרות יותר הגיונית ואשר מיושמת במקומות רבים – מספר תעודת הזהות. במקרה זה לא צפויות כפילויות, אבל תיאורטית צפויות בעיות אחרות- מה יקרה אם נעסיק עובד שאין לו תעודת זהות (נניח- עובד זר)? מה יקרה אם ננסה ליישם זאת במדינות בהן אין תעודת זהות? מה יקרה אם מספר תעודת הזהות ישתנה (נדיר אבל יתכן)? מה יקרה...
אין תגובות

כיצד מטופלים האופרטוריםIn & Exists?

08/12/2010

בפורום בסיסי נתונים בתפוז תהינו האם האופרטורים In & Exists יעילים, והאם נעשה בהם שימוש "חכם". כלומר- כשאנחנו מחפשים שורות בעלות Foreign Key בצד ה-1 שיש להן שורות תלויות בצד ה-N (הרבים) אפשר לבדוק בעזרת Join בין שתי הטבלאות, אלא שיש כאן בזבוז- המערכת תחזיר את כל ההתאמות של כל שורה (למשל עבור מוצר X את כל המכירות שלו..) כשכל מה שאנחנו רוצים זה לקבל תשובה של כן/לא.. הדרך הנכונה לעשות זאת היא בעזרת Exists או In, כשהדעת נותנת שלאחר שנמצאה התאמה אחת- המערכת תפסיק לחפש ולא תמשיך לבדוק לחינם את כל הטבלה שבצד הרבים; אך האם...
אין תגובות

יצירת כל תתי הקבוצות של קבוצה נתונה

06/12/2010

לכל קבוצה בגודל n יש 2n תת קבוצות, למשל- לקבוצה {A,B,C} יש תת קבוצות {A},{B},{C},{A,B},{A,C},{B,C}; נוסיף להן את הקבוצה המקורית ואת הקבוצה הריקה ונקבל 8=23 תת קבוצות. אם נבחר קבוצה בת 4 איברים- אפשר באותה שיטה למצוא את 16=24 תת הקבוצות שלה, או לעשות חשבון פשוט- לכל תת קבוצה של הקבוצה בת 3 האיברים ניתן להוסיף את האיבר הרביעי וניתן לא להוסיף; כלומר- מכל תת קבוצה של n=3 נקבל 2 תת קבוצות עבור n=4 ובסה"כ 16. כך מוכיחים באופן כללי את הנוסחה באינדוקציה, וזה גם ישמש אותנו ליצור את תת הקבוצות בהמשך. ...
אין תגובות

שמות הימים והחודשים

02/12/2010

ניתן לקבל את שם היום ושם החודש (פורמט מלא) של תאריך כלשהו כך: Select DatePart(Weekday,GetDate()), DateName(Weekday,GetDate()), DatePart(Month,GetDate()), DateName(Month,GetDate()), Cast(GetDate() As Varchar); כללתי בשליפה גם את מספר היום בשבוע, את מספר החודש ואת התאריך כטקסט הכולל את שם החודש בפורמט של שלוש אותיות. אני קיבלתי את הערכים הבאים: 5, Thursday, 12, December, Dec 2...
אין תגובות

With Result Sets: פרדיקאט חדש ב-Denali

01/12/2010

מהגרסה הבאה נוכל לעצב את ה-Result Sets המוחזרים על ידי הפרוצדורות בעזרת פקודה מתאימה! (סימן הקריאה נכתב בציניות כי ההתרשמות שלי היא פיהוק אחד גדול) ניקח פרוצדורה פשוטה לדוגמה: Exec sp_databases With Result Sets(( Varchar(Max) Not Null, Int Not Null, Varchar(Max) Null)); זה הסינטקס והפלט עם...
אין תגובות