הבלוג של גרי רשף

09/10/2011

יצירת טבלת מספרים

Filed under: Uncategorized — גרי רשף @ 20:43

יש הרבה בעיות שניתן לפתור עם (או רק עם) טבלת מספרים, ותמיד רצוי שתהיה אחת כזו בהישג יד של כל מפתח TSQL.
מי שאין לו יכול ליצור אחת כזו בקלות ולמלא אותה במספרים עד 10,000 או עד 100,000 באופן חד פעמי ולהשתמש בה בהמשך, ובמקרה זה לא משנה כל כך אם מילוייה יעיל או לא מכיוון שהוא מתבצע באופן חד פעמי.
מי שלא רוצה ליצור טבלה קבועה כזו יכול ליצור שליפה מתאימה שאולי תכביד מעט על הביצועים, אבל לא תחייב הרשאות מיוחדות ושינויים בסכימה.
אב"ג מרבה להשתמש בפונקציה המוצגת כאן ושבנויה על מכפלות קרטזיות:
יוצרים סט ראשוני בן שתי רשומות,
מכפילים אותו בעצמו ומקבלים 4 שורות,
מכפילים את מה שקיבלנו בעצמו ומקבלים 16 שורות,
מכפילים את מה שקיבלנו בעצמו ומקבלים 256 שורות,
מכפילים את מה שקיבלנו בעצמו ומקבלים 65,536 שורות (שזה די והותר),
וכדי להיות לצד הכספת (to be on the safe side) – נכפיל שוב ונקבל 4,294,967,296..
שר האוצר של יוון מוזמן לכפול פעם נוספת כדי לקבל את החוב החיצוני של ארצו שאיתו עליו להתמודד.
אני בדרך כלל משתמש בדרך אחרת- הרבה פחות יעילה מזו של אב"ג, אבל חביבה מאוד עלי – בעזרת CTE רקורסיבי:

With T_Misparim As
(Select 1 N
Union All
Select  N+1 N
From    T_Misparim
Where   N<1000)
Select  N
From    T_Misparim
Option (MaxRecursion 0);

clip_image002

כעקרון אפשר להשתמש בטבלאות קיימות – ובפרט בטבלאות מערכת שקיימות בכל דטבייס – כדי ליצור טבלת מספרים, למשל- נשתמש בטבלה sys.messages שיש בה כמה רבבות שורות וליתר בטחון נכפול אותה קרטזית בעצמה:

Select *
From   (Select Row_Number() Over(Order By N) N
       From    (Select 1 N From sys.messages M1
       Cross Join sys.messages M2) T) T
Where N<=1000;

clip_image004

מודעות פרסומת

להגיב »

עדיין אין תגובות.

RSS feed for comments on this post. TrackBack URI

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

בלוג בוורדפרס.קום.

%d בלוגרים אהבו את זה: