תווים מיוחדים

20/10/2010

נדרשנו להוסיף לטבלת ניהול טקסט הכולל בין היתר את האות היוונית Σ (אפשר להבין שמדובר בשדה המתאר פעולת סיכום מכיוון שסיגמה מציינת סכום). יצרתי סקריפט מתאים, הרצתי בסביבת הפיתוח ושמרתי, אבל כשפתחתי שוב כדי להעביר לסביבת הבדיקות- התברר שבכל מקום בו הופיע קודם התו Σ הופיע כעת התו ?, והסיבה לכך היא בעיית Encoding בשמירת הקובץ.. יכול להיות שיש לכך פתרון טכני (לשמירה) ואף אשמח לדעת מהו, אבל כפתרון נקודתי מאולתר השתמשתי ב- NChar(931) שמחזיר את התו המבוקש. מהיכן הפונקציה הזו צצה? ניתן להשתמש במערכת תווי Ascii שכוללת 256 תווים (כולל תווי בקרה) ולשמור אותם בתור Char או Varcahr, ואפשר להשתמש...
אין תגובות

חישוב גודל הדטבייס

18/10/2010

פרץ ויכוח במשרד בין ה-DBA-ים המשועממים: מה גודלו של הדטבייס? האחד משתמש בפרוצדורות מערכת כדוגמת sp_SpaceUsed, השני רק בפקודות DBCC, השלישי בודק את גודל הקבצים לפי טבלת המערכת sys.sysfiles, הרביעי לא מכיר את אובייקטי המערכת אלא רק את הממשק הגרפי בו הוא בודק את ה-Properties של הדטבייס על ידי קליק ימני, והחמישי – לא תנוח דעתו עד שיראה במו עיניו מה גודל הקבצים ב-File system. התוצאות השונות לא מתואמות זו עם זו, כל אחת מראה משהו קצת אחר, וכל אחד בטוח שהצדק עימו ומלגלג על זולתו.. הגדלים השונים הנמדדים הם אלו: Database Size =הגודל הכללי, כולל הלוג (זה המספר המבוקש – למי שזה...
תגיות:
אין תגובות

גימטריה

15/10/2010

חז"ל פסקו שגמטריאות הן פרפראות לחכמה, אך למעשה כל הבלוג הזה אינו אלא פרפרה אחת גדולה, ולכן לא אמשוך ידי אף מזה: Create Function F_Gimatria(@S Varchar(Max)) Returns Int As Begin Declare @I Int, @Gmtr Int; Select @I=1, @Gmtr=0; While @I<=Len(@S) Select @Gmtr=@Gmtr+Case SubString(@S,@I,1) When 'א' Then 1 ...
אין תגובות

מספרים במילים

14/10/2010

הנה פרוצדורה רקורסיבית ההופכת מספרים – עד מיליון – למילים (נניח- 999 = תשע מאות תשעים ותשע): Create Function F_Num2Text(@N Int,@ZN Bit=0) Returns Varchar(Max) As Begin Return(Case When @N=1 And @ZN=1 Then 'אחד' When @N=2 And @ZN=1 Then 'שנים' When @N=3 And @ZN=1 Then 'שלושה' When @N=4 And @ZN=1 Then 'ארבעה' ...
אין תגובות

הרשאות ל-Agent ול-Jobs

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

טרנזקציות – מה לא ידעתי עד כה?

06/10/2010

אתמול במפגש ISUG, גיא גלנצר ממדירה הירצה בין היתר על טרנזקציות, תחום שלתומי חשבתי שהכל בו פשוט ומוכר, והתברר שאין זה כך.. למשל הקוד הבא- פותחים טרנזקציה ראשית, מעדכנים טבלה, פותחים טרנזקציה משנית, מעדכנים טבלה, מבצעים Commit לטרנזקציה המשנית, ו-RollBack לראשית: Use tempdb; Go IF Object_Id('T_Trn','U') Is Not Null Drop Table T_Trn; Go Create Table T_Trn(I Int); Go Begin Tran Tr1; Go Insert Into T_Trn Values(1); Go Begin Tran Tr2; Go Insert Into T_Trn Values(2); Go Commit Tran Tr2; Go Rollback; Go Select * From T_Trn; Go האם ה-Commit הראשון שומר "באופן בלתי הפיך" את הערך 2 או שמא זה לא נגמר עד שהגברת מתחילה לשיר ומתבצע ה-Commit הסופי על הכל? 1. אם בסוף מתבצע Rollback- מתבטל כל מה שנעשה במהלך הטרנזקציה...

פונקציות חלון: יתרונות וחסרונות

05/10/2010

עד כה סברתי לתומי שפונקציות החלון הן לא רק שימושיות במובן זה שהן מאפשרות להגיע לתוצאות המבוקשות ללא משפטי SQL מורכבים ובלתי ניתנים לפיענוח, אלא שהן גם יעילות יותר: החבר'ה המצויינים ממיקרוסופט כתבו את הקוד הסודי שמשמש אותן, ולבטח עשו זאת בדרך היעילה ביותר האפשרית. למרה הפתעתי מתברר שהביצועים שלהם לא תמיד המשובחים ביותר, ולעיתים יש מקום לחשב שכר מצווה כנגד הפסדה. הדוגמאות שלהלן הן ברובן טכניות ואין מאחוריהן שום הגיון עיסקי, והן יעשו שימוש בטבלה AdventureWorks.Sales.SalesOrderDetail שיש בה מעל 120,000 שורות (כלומר- מספיק "בשר"), כאשר השאילתות הורצו על גרסת 2005. נתבונן בשתי השליפות הבאות וב-Execution Plans שלהן- הן מחזירות בדיוק...

קוד המשכפל את עצמו

בספרו "SQL Server 2005" – איציק בן גן מציג אתגר: כתיבת קוד המשכפל את עצמו. אסור להיעזר בפונקציות מערכת לזיהוי הקוד אותו אני מפעיל, למשל- SELECT DEST.TEXT FROM sys.dm_exec_connections SDEC CROSS APPLY sys.dm_exec_sql_text(SDEC.) AS DEST Where SDEC.most_recent_session_id=@@SPID; למה אסור? דווקא אחלה רעיון, ויש דרכים שונות לשלוף מהמערכת את הקוד הנוכחי שרץ.. פתרון מותר המוצג בספר (כדי לא לקלקל- הפונט בצבע לבן, ויש להעתיקו ל-SSMS): Print Replace(0x2027202729,0x20,'Print Replace(0x2027202729,0x20,')   פתרון מניח את הדעת לא מצאתי, ולכן אין ברירה אלא למצוא פתרונות לא מניחים את הדעת: 1. פתחו Query חדש ב-SSMS ולחצו על Execute. מכיוון שלא כתוב כלום, לא תתקבל אף תוצאה.. 2. הריצו את הקוד הבא (זו הודעת שגיאה שתשכפל את עצמה): Msg...
אין תגובות

אופציית Multi-Value ב-Reporting Services

03/10/2010

כשיוצרים דוח ב-SSRS ניתן להגדיר פרמטרים כך שבדוח עצמו יופיע תיבת טקסט שיש להזין לה ערך או קומבו שיש לבחור ממנו ערך, ובהתאם לכך ירוץ הדוח: Select * From sys.objects Where schema_id=@S; במקרה זה מדובר בפילטר פשוט, ובהגדרת הפרמטרים ניתן לקבוע כיצד יבחר ערך מתאים. מסך הגדרת הפרמטרים כולל גם אפשרות Multi-Value: ניתן יהיה לבחור ערך אחד או יותר מתוך הרשימה: במקרה כזה (אם נבחר ב-Multi Value)- יש לשנות את השליפה הנ"ל לשליפה הבאה: Select * From sys.objects Where schema_id In (@S); הסינטקס הזה לכאורה שגוי- נסו להריץ את הקוד הבא ותקבלו שגיאה מכיוון שבעמודה schema_id יש מספרים ו-S@ הוא...
אין תגובות

החור הראשון

הלו- מה זה? אתה בענייני SQL או….?.. קודם כל להירגע (ככתוב בספר בישול ידוע): בסך הכל שאלו אותי בעבודה כיצד למצוא בטבלה עם עמודת מספרים את הערך הראשון שחסר, הווה אומר- החור הראשון ברצף. את הפטנט למדתי לפני שנים מאיציק בן גן: מבצעים Left Join של הטבלה עם עצמה לפי N=N+1 (כלומר– לכל שורה נתאים את הבאה אחריה), נחפש את אלו להם לא נמצאה התאמה, נבצע Top 1 כי מעוניינים בראשון, ולא נשכח להוסיף 1 לערך שקיבלנו (הרי לא מצאנו את הראשון שחסר אלא את האחרון שאינו חסר..). ניצור טבלת מספרים בת כמיליון שורות, ונשמיט ברשלנותנו מספר ערכים בדרך: Create Table #T(I Int...
אין תגובות