חיפוש פתרונות למשוואות

31/05/2010

כל עוד מדובר במשוואות מהמעלה הראשונה והשניה – כמוהן אנחנו זוכרים מימי לימודינו בבית הספר – ניתן לפתור אותן באופן אנאליטי: מעבירים אגפים, עושים מכנה משותף, משתמשים בנוסחה למציאת שורשי משוואה ריבועית וכו'. במשוואות ממעלה גבוהה יותר או שאינן פולינומים – זו כבר עלולה להיות בעייה לא פתירה, ולעיתים יש לחפש פתרון "בכח" בתחום מסויים: קובעים גבול עליון וגבול תחתון, ואט-אט מצמצמים את התחום עד שמגיעים לדיוק הרצוי וכך מקבלים את התוצאה בקירוב די טוב. יש מספר שיטות לצמצום התחום, והחביבה עלי נעזרת ביחס הזהב (..0.618033): 1. נסמן את הגבול התחתון...

הרצה אסינכרונית של פרוצדורות באמצעות Service Broker

27/05/2010

הפוסט הבא מתבסס על פוסט שפירסמתי בעבר ב-www.SqlServer.co.il. לעיתים אנחנו מעוניינים להריץ פרוצדורה באופן אסינכרוני, כלומר- להריץ אותה ובמקביל להמשיך בטיפול בנושאים אחרים. כל עוד אנחנו עובדים ב-SSMS זו אינה בעייה- פותחים Query חדש, מפעילים שם את הפרוצדורה, ובינתיים חוזרים ל-Query עליו עבדנו וממשיכים בדרכנו; אבל אם רוצים לעשות זאת מתוך פרוצדורה או קוד שרצים אוטומטית- זו קצת בעייה מכיוון שאם נפעיל מתוך פרוצדורה ראשית פרוצדורה משנית – הראשית תמתין עד שהמשנית תסתיים ורק אז תמשיך, שלא לדבר על כך שאם יש תקלה במשנית- גם הראשית תיפול בשל כך.. עד...
אין תגובות

CTE רקורסיבי

26/05/2010

CTE = Common Table Expression הוצג ב-SQL Server 2005, ומדובר בסינטקס שמאפשר ליצור אובייקטים אד-הוק במהלך השליפה; וזו חלופה מתאימה לשאילתות משנה. ל-מ-ש-ל: אנחנו רוצים לשלוף את שמות הטבלאות בעלות השם הכי ארוך. לכאורה ניתן לשלוף את ((Max(Len(name מתוך sys.tables, אבל אם יש מספר טבלאות בעלות אותו אורך מקסימלי- נקבל רק אחת. ניתן, איפוא, להיעזר בשליפה משנית כך: Select * From (Select Max(Len(name)) Over() Oreh, ...

עץ פורש מינימלי

25/05/2010

בעיית העץ הפורש המינימלי היא בעייה קלאסית בתחום תורת הגראפים. לא כולם אוהבים או מתמצאים במתימטיקה, אלא שדווקא תורת הגראפים היא תחום קל להבנה אינטואיטיבית – ללא נוסחאות, ואפשר בקלות להבין מה הבעייה ואפילו כיצד לפתור אותה- מכיוון שהבעיות ויזואליות; בעיקר בבעייה זו. אשתמש באלגוריתם של Prim אותו אממש בעזרת CTE רקורסיבי: 1. נמספר את הקשתות בסדר עולה לפי האורך, ונתחיל עם הקטנה ביותר. 2. "נצבור" בעמודה S_in את הקשתות הכלולות בעץ הפורש המינימלי (כלומר- שני הקודקודים של כל קשת). 3. כל...

משלוח מיילים מ-SQL Server לבעלי חשבון GMail

22/05/2010

Database Mail של SQL Server מאפשר לשלוח מיילים עם התראות לאנשי הפיתוח והאדמיניסטרציה- כשיש תקלות וגם כשהכל הולך כשורה, הודעות לעובדים, ללקוחות, ולספקים, וגם מאפשר לשלוח מסרונים (SMS-ים) דרך ספקי שירות שממירים הודעות מייל. מכיוון ש-GMail הוא חשבון המייל הפופלרי כיום, וגם אם לא- אני משתמש בו וזו סיבה מספקת, אני אדגים באמצעותו. קודם כל נאפשר להשתמש ב-Database Mail: sp_CONFIGURE 'show advanced', 1 Go Reconfigure Go sp_CONFIGURE 'Database Mail XPs', 1 Go Reconfigure Go ונקנפג כך את המערכת (השתדלתי את כל השמות החופשיים שאינם מילים שמורות – להתחיל ב-My כדי להבהיר שכל אחד יכול לשנות בהתאם למה שנוח לו): Use msdb; Go Exec msdb.dbo.sysmail_add_profile_sp @profile_name='MyMailProfile', ...
אין תגובות

פיצול מחרוזת (Split)

18/05/2010

פיצול מחרוזת של ערכים המופרדים בפסיקים לסט- זה אתגר שיכול לצוץ כשעובדים עם מידע המגיע בקבצי טקסט, או אולי כשרוצים להעביר מערך שנוצר בשפת תכנות כלשהי לתוך טבלה ב-SQL Server: יהיה מאוד לא יעיל לעבור בלולאה על המערך וכל ערך להכניס בנפרד לטבלה, ובמקום זה עדיף לשרשר את כולם למחרוזת אחת, להעביר ל-SQL Server ולתת לו לפצל אותה ולקלוט את הערכים. להלן מספר "הצעות הגשה", כלומר- מספר פתרונות אפשריים. קודם כל ניצור מחרוזת מספיק ארוכה שיהיה מה לפצל. להלן סקריפט קצר שמשרשר 10,000 ערכים אקראיים ושומר אותם בטבלה זמנית בת שורה אחת (שוב- בשלב זה יש לנו מחרוזת אחת אותה יש לפצל...
אין תגובות

האח הגדול עינו פקוחה (5) – מי שינה את הנתונים בטבלה?

13/05/2010

בחברה קמעונאית בה עבדתי בעבר היו כל מיני מבצעים לקידום מכירות, על פי התוצאות היו מתגמלים את מנהלי האזורים וסוכני המכירות, והיו כל מיני הגדרות מי שייך למה ומי זכאי למה לטובת הנ"ל. אינני זוכר את הפרטים בדיוק, אבל באופן כללי הקמתי טבלה עם נתונים הקשורים למערכת התגמולים, כעבור מספר חודשים באו אלי בטענות שההגדרות אינן מתאימות למה שנקבע מלכתחילה, כולם – כולל אני – ניערו חוצנם וטענו שלא הם שינו את הנתונים האלו, ועכשיו לך חפש מי ומה ומתי.. נניח שיש לנו טבלת עובדים צנועה עם שמות העובדים ומשכורותיהם (אפשר כמובן להרחיב את הטבלה בהתאם לדוגמה): USE tempdb; GO If object_id( 'T_Ovdim') Is Not Null Drop Table T_Ovdim; Go Create...

Index Fragmentation

12/05/2010

כשיוצרים Clustered Index מוגדר לו Fill Factor שקובע איזה אחוז מהדפים (Pages) יהיה מלא. הסיבה לכך היא שכשמוסיפים ערכים חדשים באמצע האינדקס ואין שם מקום פנוי (מה שקורה כשה-Fill Factor הוא 100%)- המערכת מוסיפה את הערך בדף חדש, ובדף המלא יוצרת הפניה אליו: יהיה מאוד לא יעיל "להזיז" את כל האינדקס מנקודת ההוספה ואילך מקום אחד קדימה, ולכן אין ברירה אלא לפצל אותו ובכך ליצור פרגמנטציה. כמובן שכשיש מקום פנוי- מכניסים לשם את הערך החדש. ניצור טבלה חדשה על בסיס טבלה קיימת ב-AdventureWorks, נכניס לתוכה 200 רשומות אקראיות...

משמעות השימוש ב-Collation ובחירה באופציה המתאימה

09/05/2010

יש ארבע אופציות ל-Collation עברי: Hebrew_CI_AS Hebrew_CS_AS Hebrew_CI_AI Hebrew_CS_AI CI=Case Insensitive מציין שאינו רגיש להבדלים בין אותיות רגילות לסופיות (אותיות כמנפ"צ) CS=Case Sensitive מציין שהוא רגיש להבדלים בין אותיות רגילות וסופיות (זה מה שאתה מחפש) AI=Accent Insensitive מציין שאינו רגיש להבדלים בין אותיות לא מנוקדות למנוקדות (א=אֶ=אֳ) AS=Accent Sensitive מציין שהוא רגיש להבדלים בין אותיות לא מנוקדות למנוקדות. דוגמה: ניצור דטבייס בעל Collation עברי כלשהו כדי שיוכל לתמוך באותיות עבריות (אחרת הן עלולות להיות מוצגות כסימני שאלה): Use tempdb; Go If DB_ID('Tmp') Is Not Null Drop Database Tmp; Go Create Database Tmp Collate Hebrew_CS_AS; Go Use Tmp Go ניצור טבלה ונכניס לתוכה מספר מחרוזות שמתחילות באותיות 'תנ': Create Table MyTbl(ID Int,Coteret Varchar(20)); Go Insert Into MyTbl Values(1,'תן'); Insert Into MyTbl Values(2,'תנין'); Insert Into...
אין תגובות

השימוש ב-SQLCmd וב-SQLCmd Mode

06/05/2010

אני מתבייש לספר אך עד לפני מספר ימים חשבתי ש-SQLCmd זה OSQL משופר שמאפשר להריץ Command Lines ותו לא, ובזכות המצגת של מריה ב-ISUG למדתי שיש הרבה יותר משחשבתי.. באופן כללי התרשמתי שאם עד כה, כדי להריץ פקודות SQL ובמקביל פקודות של מערכת ההפעלה (נניח- יצירת מחיצה וביצוע גיבוי אליה), הייתי כותב קוד SQL ומשתמש ב-xp_CmdShell, או בונה פתרון SSIS שכולל לסירוגין אובייקטים מתאימים למשימות השונות; הרי כעת יש לנו אפשרות נוספת של כתיבת סקריפטים המשלבים פקודות SQL ופקודות מערכת שניתן להפעילם משורת הפקודה על ידי SQLCmd. לפני שאעבור לדוגמאות (הרצת סקריפטים משורת הפקודה) כדאי לציין שניתן לעבוד ב-SSMS ב-SQLCmd Mode: New Query...
אין תגובות