היכן הפסיק ה-n-י? (מציאת מופע של תת מחרוזת): גרסת ה-String_Split

07/04/2016

לפני למעלה מ-6 שנים, בראשית דרכי כבלוגר, פרסמתי את הפוסט היכן הפסיק ה-n-י? (מציאת מופע של תת מחרוזת):נתונה טבלה ובה עמודת Subjects עם מקצועות שונים שכל סטודנט לומד - Create Table T_Students (Name VarChar(50), Subjects VarChar(Max));GoInsert Into T_StudentsValues ('Ana','Geography,Literature'), ('Beni','Chemistry,Economics,History,Sociology'), ('Carmel',''), ('Dana','Literature,Economics,Philosophy,Sociology'), ('Eli','Zoology,Economics,Geography,History,Science'), ('Felicia','Medicine');Go ויש לשלוף את המקצוע הרביעי (אם יש..) של כל סטודנט.הפתרון שאז מצאתי, בלוגר צעיר ונרגש שחרד...

Create & Drop Index

06/04/2016

מה, זה לא צריך להיות Drop & Create? מוחקים אינדקס קיים, ויוצרים מחדש גרסה משופרת שלו, בדרך כלל עם תוספת של עמודה לאינדקס עצמו או לרשימת ה-Include..אז זהו שלא, וזה שייך לפינת ה”וואלה?” של השבוע, ובעברית - “איך לא חשבתי על זה קודם?”..פיני קרישר, ראש הצוות הבלתי נלאה, סיפר לי שקודם הוא עשה Drop לאינדקס, ואז תוך כדי כך שהאינדקס החדש נבנה – משימה כבדה בפני עצמה,  השרת התחיל לטחון Table Scans כי האינדקס לא היה קיים וה-Execution Plan השתנה לרעה, ה-CPU נסק אל על, ה-IO חגג, והשמחה הייתה רבה..בפעם הבאה ניצור קודם כל את האינדקס החדש עם שם...
תגיות: , ,
אין תגובות

חיתוך בין רשימות בעזרת הפונקצייה String_Split

29/03/2016

הפונקצייה החדשה בגרסת 2016 יכולה להוות מקור לשימושים מעניינים. נכון שגם בעבר יכולנו ליצור user defined function בעזרת TSQL או בעזרת CLR, אלא שהחוכמה אינה לומר “מצאתי פתרון בעזרת פונקציית CLR שעושה את העבודה” אלא “מצאתי פתרון בעזרת מה שיש”. כעת “מה שיש” כולל גם את String_Split. אלו החוקים! (שלי לפחות..) הדוגמה שלהלן מעט מלאכותית, אבל יכולה להיות שימושית בנסיבות מסויימות, וזה תנאי מספיק לכתיבת פוסט.נתונה טבלת עובדים/תלמידים ולכל אחד מצויינות השפות בהן הוא שולט: If Object_ID('tempdb..#T','U') Is Not Null Drop Table #T; Create Table #T(Name NVarchar(10), ...
אין תגובות

פונקצייה חדשה: String_Split

28/03/2016

פונקצייה חדשה שהתווספה לגרסה האחרונה של 2016, וכפי ששמה מעיד עליה – היא מבצעת Split והופכת מחרוזת לסט.בערך כך: Select *From String_Split('1,2,3,4,5,6,7,8,9,10',','); צריך להעביר שני פרמטרים: המחרוזת שצריך לפצספלט (שילוב של פיצול וספליט) והתו המפריד בין ערך לערך (תו אחד בלבד!).עד כה היינו צריכים להתלבט בין שימוש ב-CTE רקורסיבי או XML (מוסרבל ולא יעיל), דרך פונקציית משתמש (יותר יעיל אך מחייב יצירת אובייקט), וכלה בפונקציית CLR (הכי יעיל אבל צריך “ללכלך” את הידיים ולתחזק את הקוד). כעת יש כלי מובנה והחיים נראים יפים מתמיד! טוב. אז מה עושים עם זה: אמרנו כבר Split?...
אין תגובות

פנייה בין דטבייסים שונים ב-Azure

24/03/2016

כדי לגשת משרת On Premise ל-Azure, ניתן להשתמש ב-Linked Server, אך כיצד לגשת מ-Azure ל-Azure? הרי גם פנייה מדטבייס אחד לאחר בתוך אותו שרת אינה אפשרית ב-Azure, אז לא כל שכן בין שרתים שונים.. בדטבייסים מגרסת V12 יש כעת פתרון יחודי, השונה מה-Linked Server המוכר בכך שלא יוצרים איזה אובייקט או קישור דרכו ניגשים לכל האובייקטים בדטבייס האחר, אלא לכל אובייקט יוצרים קישור נפרד המבוסס על תשתית משותפת.. הבנתם משהו?.. לא הרבה, והאשם ביכולת הניסוח הלקוייה שלי, ולכן טוב מראה עיניים: דוגמה! ניגש קודם כל לדטבייס Azure ממנו נרצה לקרוא נתונים, וניצור שם טבלה עם מעט נתונים ו-View: If Object_ID('T_Try','U') Is Not...
אין תגובות

כתיבה וניקוד בעברית

27/02/2016

במקום בו אני עובד, הכל נכתב באנגלית – המידע בטבלאות וגם ההתכתבויות הפנימיות באימיילים, אבל גם במקומות בהם כן נשמר מידע בעברית – סביר להניח שאין צורך בניקוד.יחד עם זאת – מי יודע? תמיד יצוץ הצורך בכך, ועלינו להיות מוכנים עם פתרונות! כיצד מנקדים טקסט בעברית? הפתרון המוכר הוא ללחוץ על Caps Lock, ואז Shift ואחד המקשים בשורה העליונה במקלדת (שורת הספרות).למשל- כדי לכתוב בּ (ב’ עם דגש) יש להקליד ב, ללחוץ על ה-Caps Lock, ואז <Shift><+> (כלומר- Shift לחוץ ותוך כדי כך לחיצה על פקש פלוס (+) בשורה העליונה).שאר המקשים משם שמאלה כווללים את כל שאר תווי הניקוד:...
תגיות: , ,
אין תגובות

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

16/02/2016

הפוסט הזה נכתב בעקבות בעייה אמיתית, אבל כדי לפשט ולהקל אתמקד בעניין העקרוני ולא המעשי.נתונה קבוצת המספרים 1..N, ואנחנו מעוניינים לקבל את כל תתי הקבוצות שלה.ל-N מספרים יש (2 בחזקת N) תתי קבוצות. למשל: לקבוצה {1,2} יש 2^2=4 תתי קבוצות: {},{1},{2},{1,2}, והן כוללות גם את הקבוצה הריקה {} וגם את הקבוצה המקורית כולה – הקבוצה האוניברסלית - {1,2}.למה (2 בחזקת N) תתי קבוצות? כי כל איבר יכול להיות בקבוצה ויכול לא להיות (=2 אפשרויות), ולכן יש לכפול את 2 בעצמו כמספר האיברים הקבוצה.אציג להלן 2 דרכים שונות להתמודד עם המשימה.הדרך הראשונה מחוללת את (2 בחזקת N) המספרים, וליצוג הבינארי...
אין תגובות

Partitioned View

21/01/2016

מדובר בטכנולוגיה ישנה יחסית שיש לה חלופה חדשה יחסית (Partitioned Table), אך שעדיין לא נס ליחה..על קצה המזלג: במקום להחזיק נתונים היסטוריים בטבלה אחת, נפזר אותם במספר טבלאות – כל אחת של תקופה אחרת (נניח – לכל שנה טבלה), ולכל אחת ניצור Constraint שיבטיח שרק נתונים מתאימיםמבחינת התאריך יכנסו אליה. לבסוף ניצור View שיבצע Select .. Union All מכל הטבלאות, ואליו נפנה את שאילתות ה-Select, ובזכות ה-Constraints המערכת תדע לאילו איזו טבלה לגשת (כמובן – בהנחה שיש פילטר על התאריך). בטכנולוגיה של Partitioned Tables הפתרון קצת יותר מורכב, אך יעודי למטרה זו. היא נכללת בגרסת 2005 שהיא כבר די...
תגיות: ,
אין תגובות

The target principal name is incorrect. Cannot generate SSPI context

18/01/2016

תקציר העלילה: ניסיתי להתחבר לשרת דרך ה-SSMS, וקיבלתי את הודעת השגיאה הבאה: בדיקה מהירה העלתה על פי הסדר: השרת מגיב ל-Ping, ומכאן שהוא חי וקיים. אולי ה-Service למטה? הצלחתי להתחבר בהצלחה ב-Remote לשרת עצמו, כך ש”אני בסדר”, ומתברר שה-Service למעלה (ליתר בטחון ביצעתי לו restart). אולי יש בעייה בהתחברות מה-SSMS? בדקתי עם החבר’ה במשרד וכולם מצליחם להתחבר, חוץ ממני. כנראה משהו אישי נגדי.. בדקתי ב-Error Log של ה-SQL ומצאתי כדלקמן: Login failed for user 'MyDommain\GeriReshef'. Reason: Could not find a login matching the name provided. מידע שאינו מועיל במיוחד. הכתובת הבאה הייתה גוגל: פתרונות ועצות לא...
תגיות: , ,
אין תגובות

JSON וחידושים נוספים ב-SQL Server 2016

23/12/2015

התמיכה החלקית ב-JSON היא בין הבשורות של גרסת 2016 לחובבי ה-Big Data: במערכות כמו DocumentDB ניתן לשמור מידע בקבצי JSON במקום בטבלאות, וכך לא להיות מחוייבים לתבנית קבועה, וכמובן בלי טרנזקציות, Foreign Keys ועוד כל מיני “רעשים” שכאלו. בבחינת – בואו נעגל קצת את הפינות, נעשה קצת הנחות בכללי הדטבייס הרלציוני, ונהנה מביצועים משופרים.לא ארחיב מעבר לכך כי זה לא התחום שלי, אבל כך זה נראה: Select *From sys.objects; Select *From sys.objectsFor JSON Auto; שלפתי מטבלת המערכת sys.objects פעם שליפה...
אין תגובות