שירשור סקריפטים

28/09/2010

הנה טיפ שימושי: מדובר בפקודת Dos ותיקה ומוכרת, שהפעם נעשה בה שימוש לטובת DBA-ים של SQL Server. בתהליך הפיתוח אנחנו יוצרים אובייקטים (טבלאות, פרוצדורות..), מכניסים ערכים לטבלאות הגדרות וניהול וכו'. כל פעולה כזו נשמרת בסקריפט נפרד, וכשמעלים גרסה משרת הפיתוח לשרת הבדיקות – יוצרים מהסקריפטים הרלוונטיים סקריפט אחד ארוך שכולל את כולם לפי סדר הגיוני. נניח שהסקריפט הראשון כלל יצירת טבלה ונשמר בתור C:\Tmp\A.sql Use tempdb; Go Create Table MyTbl(Taarih DateTime); Go הסקריפט השני כלל הוספת שורה לטבלה הנ"ל ונשמר בתור C:\Tmp\B.sql Use tempdb; Go Insert MyTbl Select GetDate(); Go והסקריפט השלישי כלל הוספת עמודת Identity לטבלה ונשמר בתור C:\Tmp\C.sql Use tempdb; Go Alter Table MyTbl Add ID Int Identity Primary Key; Go כעת בעזרת פקודת...
אין תגובות

חישובי מע"מ, שערי חליפין וכו' המשתנים לאורך זמן

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

משלוח מיילים דרך Gmail באמצעות פרוצדורת CLR

25/09/2010

הפוסט פוסם לראשונה ב-www.SQLServer.co.il. משלוח מיילים מתוך Sql Server זו משימה פשוטה למדי: צריך רק להגדיר, לקנפג, לקסטם, לדבג, לאתחל, ולפבלש וזה עובד.. זו לפחות הייתה ההרגשה שלי בעבר, אבל החל מגרסת 2005 – משלוח מיילים נעשה הרבה יותר פשוט ונוח באמצעות הפרוצדורה msdb.dbo.sp_send_dbmail, ונוספה גם האפשרות לכתוב פרוצדורת Clr (במקרה שלנו באמצעות VB.net) ולהפעיל אותה מתוך ה-SQL Server- אופציה חשובה לגרסאות שאינן מאפשרות משלוח מיילים בדרכים אחרות. מכיוון ש-Gmail הוא ספק שירותי המייל המוביל כיום, אני אדגים באמצעותו. מי שמשתמש בחשבון אחר, יצטרך ברוב המקרים רק לשנות את חשבון ה-smtp (החשבון המאפשר משלוח מיילים והוא מופיע בהגדרות ה-Outlook – למי שיש..). כתיבת...
תגיות:
אין תגובות

נפח אחסון טבלאות

22/09/2010

בפוסט זה אני עוסק בנפח טבלאות כפי שמחושב על ידי פרוצדורת המערכת SP_SpaceUsed, והשפעת פעולות הכנסת המידע ומחיקתו עליו. ניצור תשע טבלאות, נכניס לתוכן מספרים, נחשב את נפחן בעזרת SP_SpaceUsed, נרוקן אותן – בדרכים שונות, ושוב נחשב את נפחן בעזרת SP_SpaceUsed: T_1000_NoIndex -טבלת Heap בת 1000 שורות שתרוקן בעזרת פקודת Delete פשוטה T_1000_ClusteredIndex -טבלה בת 1000 שורות בעלת Clustered Index שתרוקן בעזרת פקודת Delete פשוטה T_1000_Index -טבלה בת 1000 שורות בעלת Index רגיל שתרוקן בעזרת פקודת Delete פשוטה T_1000000_NoIndex - טבלת Heap בת 1000000 שורות שתרוקן בעזרת פקודת Delete פשוטה T_1000000_ClusteredIndex - טבלה בת 1000000 שורות בעלת Clustered Index שתרוקן בעזרת פקודת Delete פשוטה T_1000000_Index - טבלה...

כיצד לעיין בקוד פרוצדורה

21/09/2010

באיזשהו מקום במערכת משתמשים בפרוצדורה (או שמא בפונקציה?) MyCode ואנחנו מעוניינים לדעת מה הקוד שלה, כדי להבין מה היא עושה וכיצד.. לרוב ניגש לשוליים השמאליים של ה-SSMS, נחפש את השרת עליו אנחנו עובדים, נאתר את הדטבייס הרלוונטי, נפתח את Programmability, ניגש ל-Stored Procedures או ל-Functions (במקרה השני- נצטרך להימלך בדעתנו אם מדובר בפונקציית טבלה או בפונקציית סקלאר), ואז נמצא ברשימת האובייקטים את מבוקשנו.. רגע- לא סיימנו: קליק ימני, ו-Midify.. אפשר לקצר כל זאת כך: Exec sp_HelpText MyCode; Go והקוד יופיע ב-Grid למטה. אם נרצה לערוך או לעיין בו בעורך הטקסט- נסמן ונעתיק אותו למקום המתאים. על ה-Exec, ה-;, וה-Go אפשר לוותר: אני מציין אותם רק בשביל...

השפעת האינדקס על חיפוש בטבלה

19/09/2010

ניצור טבלה- בשלב ראשון ללא אינדקס: Use tempdb; Go If object_id('SalesOrderDetail') Is Not Null Drop Table SalesOrderDetail; Go Create Table SalesOrderDetail(SalesOrderID int, SalesOrderDetailID int, CarrierTrackingNumber nvarchar(25) NULL, ...

סטטיסטיקה על עמודות לא מאונדקסות

15/09/2010

SQL Server שומר מידע סטטיסטי לגבי עמודות בטבלאות: בדרך כלל, בעת שמתבצעת לראשונה שליפה עם תנאי Where על עמודה-המערכת מחשבת סטטיסטיקה לגביה, ועושה בה שימוש בהמשך ליעול השליפות. הסטטיסטיקה היא מידע לגבי התפלגות הנתונים לפי טווחים, כלומר- היסטוגרמה (לא גרף אלא טבלה שניתנת לתיאור גרפי כהיסטוגרמה), ובה עד 200 שורות. אלו לא הנתונים המדוייקים – בשביל זה יש טבלה – אלא תצוגה סיכומית שמאפשרת להעריך כיצד הנתונים מפוזרים. למשל- אם יש טבלת עובדים ובה עמודת גובה, הסטטיסטיקה תאפשר למערכת לדעת שמעט עובדים יכולים להיות בגובה 200 ס"מ, ושמספר רב של עובדים הם בין 160 ס"מ ל-170 ס"מ. כמובן שהמערכת אינה פטורה...

אובייקטים זהים המתקיימים במקביל באותו Session

13/09/2010

נתבונן בקטע הקוד הבא: Declare @I Int; Set @I=1; Select @@SpID ,@I ; יצרנו משתנה, הצבנו בו את הערך 1, והצגנו את מספר ה-Session שלנו ואת ערכו של המשתנה. כל בר דעת מבין שהמשתנה I@ התקיים במהלך הרצת הקוד ונעלם עם סיומו, ושיכול להיות רק משתנה אחד כזה באותה נקודת זמן באותו Session. כלומר- אני יכול לפתוח חלון Query חדש ושם להגדיר במקביל עוד משתנה I@ או להריץ סקריפט נוסף לאחר שהנ"ל הסתיים ושגם בו יוגדר I@, אבל באותו Session ובאותה נקודת זמן זה לא יתכן, ומי שינסה זאת יקבל הודעת שגיאה: Declare @I Int; Set @I=1; Declare @I Int; Msg 134, Level 15, State 1, Line 3 The...

לכידת פלט של SQL דינאמי

אנחנו רוצים לקלוט לתוך משתנה את מספר השורות בטבלה או אולי במשפט SQL, למשל טבלת המערכת sysobjects: Declare @Cnt Int; Select @Cnt=Count(*) From sys.objects; Select @Cnt; Go קל ופשוט! מה נעשה אם נקבל את שם הטבלה בתור משתנה? במקרה זה נצטרך לבנות ולהריץ משפט SQL דינאמי מכיוון שלא ניתן להריץ משפט בסגנון Select Count(*) From @Tbl, ואזי איך נקלוט את התוצאה לתוך משתנה? להלן דוגמה כיצד: Declare @Tbl NVarchar(Max), @SQL NVarchar(Max), @Cnt1 Int; Select @Tbl='sys.objects'; Select @SQL='Select @Cnt2 = Count(*)...
אין תגובות

Cursor ללא Cursor

11/09/2010

השימוש ב-Cursor הוא דרך המלך למשימות שלא ניתן לבצע בכלים הסטנדרטיים של SQL, למשל – כפי שיודגם להלן – גיבוי כל הדטבייסים בשרת שאינם System Databases. הפתרון הסטנדרטי בעזרת Cursor הוא כזה: Declare @S Varchar(Max), @SQL Varchar(Max); Declare Cr Cursor For Select name From sys.databases Where name Not In ('master','tempdb','model','msdb'); Open Cr; Fetch Cr Into @S; While @@Fetch_Status = 0 Begin Set @SQL='Backup Database '+@S+' To Disk = ''C:\Tmp\'+@S+'.bak'';'; Print @SQL; Exec(@SQL); Fetch Cr Into @S; End Close...
אין תגובות