יש הרבה בעיות שניתן לפתור עם (או רק עם) טבלת מספרים, ותמיד רצוי שתהיה אחת כזו בהישג יד של כל מפתח 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);
כעקרון אפשר להשתמש בטבלאות קיימות – ובפרט בטבלאות מערכת שקיימות בכל דטבייס – כדי ליצור טבלת מספרים, למשל- נשתמש בטבלה 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;