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

09/10/2011

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

שייך לקטגוריה: 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 של התגובות על הרשומה הזו טרקבאק קישור

כתיבת תגובה

Fill in your details below or click an icon to log in:

WordPress.com Logo

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

Twitter picture

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

Facebook photo

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

Connecting to %s

ערכת עיצוב: Shocking Blue Green. בלוג בוורדפרס.קום.

Follow

Get every new post delivered to your Inbox.

הצטרפו אל 25 שכבר עוקבים אחריו