הוספת שורות לשתי טבלאות בו זמנית

01/12/2016

פעם כתבתי פוסט על הנושא, בעיקר בתור אתגר; בשם חסכו ואמצו (2).באופן כללי, ניתן לשלוף את השורות שהשתנו (במקרה זה – התווספו) על ידי האופרטור Output,ואם קצת מתחכמים – להפנות את הפלט של ה-Output לטבלה שניה.בערך כך: If Object_ID('B') Is Not Null Drop Table B; If Object_ID('A') Is Not Null Drop Table A; Create Table A(ID Int Identity Primary Key, ...
אין תגובות

איך יש לו הרשאות? הקבוצה BUILTIN\Administrators

16/11/2016

מכירים את זה שיום אחד אתם מגלים משהו “חדש” אבל מתברר שהוא די ישן, ויש לכם הרגשה שכולם ידעו עליו ורק אתם לא?..מה, אתם לא מכירים את זה?.. נו, טוב: כנראה שזה רק אני.. :-( לאחד המשתמשים יש הרשאות נדיבות באחד האינסטנסים. זה לא סתם “אחד המשתמשים” אלא בעל תפקיד ניהולי, אבל לא אמורות להיות לו הרשאות ליצור דטבייס חדש.. אני ניגש לאופציית ה-Security ב-SSMS, אך שם יש לו לכל היותר הרשאות public (כלומר- הוא יכול להתחבר ותו לא), והוא אינו משוייך לאף Role.אם כך – אולי הוא משוייך לאחת הקבוצות ברמת ה-Active Directory.. אולי כן ואולי לא, אבל...
תגיות: , ,
אין תגובות

מניעת חריגות מערכים אפשריים בעמודות Identity וב-Sequences

25/10/2016

לעמודות בטבלאות יש מגבלות של גובה הערכים (בעמודות מספרים או תאריכים) או של אורך מחרוזות (בעמודות טקסטואליות), ובדרך כלל תקלות אמורות להימנע באופן אפליקטיבי.הפוסט הזה מטפל במניעת חריגות בעמודות Identity וב-Sequences: למשל, הגדרנו עמודת Int כ-Identity, הערך בעמודה הולך וגדל, וקצת אחרי 2 מיליארד הגענו לגבול העליון של Int. כשזה יקרה הקוד שינסה להכניס נתונים לטבלה יפול, והטיפול עלול להיות מורכב: שינוי העמודה (כולל הנתונים בה), שינויים במשתנים בפרוצדורות שמטפלות בה, שינויים ברפליקציות ועוד. סיפור שלם!תרומתי הצנועה למערכה היא סקריפט שמציג את הערכים הנוכחיים לצד הערכים המקסימליים האפשריים, בכל האובייקטים הרלוונטיים: Declare @SQL Varchar(Max);Select ...
אין תגובות

שילוב של האופרטורים In ו-Like

27/09/2016

נניח שרוצים למצוא בטבלה את כל השורות בהן עמודה מסויימת שווה ל-.. או ל.. או ל.. וכו’ (רשימה ארוכה של ערכים אפשריים). במקום לכתוב משהו כמו- Select *From MyTblWhere MyCol='..' Or MyCol='..' Or MyCol='..' .. נכתוב משהו אלגנטי וקריא יותר בסגנון של- Select *From MyTblWhere MyCol In ('..', '..', '..', .. ..); מה נעשה אם נרצה לכתוב משהו כמו- Select *From MyTblWhere MyCol Like '%..%' Or Like MyCol='%..%' Or MyCol Like '%..%' .. הרי לא נוכל לשלב In ו-Like ביחד.מה עושים?פתרון פשוט אין,...
אין תגובות

סטטיסטיקה: עדכון וקבלת החלטות

13/04/2016

הפוסט שלהלן ממחיש את השימוש בסטטיסטיקה על ידי המערכת לבחירת ה-Execution Plan, ואת השפעתה של סטטיסטיקה לא מעודכנת על שימוש זה ואיכות הבחירה. בעזרת טבלת sys.messages (טבלת מערכת בת כ-250,000 שורות) אבנה טבלה עם נתונים היסטוריים, כלומר- אכניס את תוכן טבלת המערכת לטבלה שאבנה, בתוספת תאריך: If Object_ID('T_Messages','U') Is Not Null Drop Table T_Messages; Create Table T_Messages ( DateTime Not Null, message_id Int Not Null, language_id Int Not Null, ...

היכן הפסיק ה-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...
אין תגובות