Paging ללא הכלים של SQL 2012

20/03/2012

גרסת 2012 הביאה עמה את היכולת לבצע Paging ביעילות, אך מה יעשו אלו שאינם מתכוונים לשדרג לגרסה החדשה בתקופה הקרובה? המונח Paging מתייחס ליכולת לשלוף טווח של שורות לאו דווקא מתחילת הטבלה, כמקובל בחיפושים כדוגמת Google בהם מוצגות 50 תוצאות (נניח) ואנחנו יכולים לדפדף ל-50 התוצאות הבאות, ומשמעות הדבר שהמערכת שולפת את השורות 51-100. בגרסת 2012 זה מתבצע בעזרת הפקודה שמבצעת כמתבקש Scan של 100 השורות הראשונות, ומתוכן היא בוחרת את 50 השורות "השניות". כיצד ניתן לעשות זאת בכלים הותיקים והמוכרים? ניצן להציע...
תגיות: , , ,
3 תגובות

חישוב סכום מצטבר תוך פניה אחת לטבלה

16/03/2012

האם ניתן לחשב סכום מצטבר (Running Sum) תוך פניה אחת לטבלה וללא שימוש בפונקציות החלון החדשות שבגרסת 2012? בפוסט מתחילת החודש טיפלתי בנושא חישובי מלאי- חישובים שכרוכים בחישוב סכומים מצטברים, והראיתי כיצד השימוש בפונקציות החלון החדשות של גרסת 2012 מייעלות את החישובים בצורה משמעותית, בעיקר מפני שמתבצע Scan אחד על הטבלה. בפוסט אחר ישן יותר הראיתי כיצד ניתן לבצע Lag & Lead תוך פניה אחת לטבלה (כלומר- ללא Join עצמי או שאילתת משנה הפונה לטבלה) וללא שימוש בפונקציות החלון החדשות של גרסת 2012; ותהיתי אם ניתן לחזור על התרגיל הזה גם כאן. ...
אין תגובות

Context_Info – משתנה גלובאלי ברמת ה-Session

13/03/2012

ב-SQL Server אין משתנים גלובליים שקיימים מחוץ ל-Scope של הבלוק או האובייקט בו הם מוגדרים, והאופציה הכי קרובה לזה היא Context_Info שהוא מעין משתנה גלובאלי מסוג (Varbinary(128 (כלומר- יכול להכיל עד 128 תווים) שקיים עד שה-Session מסתיים. לא ניתן להכניס לתוכו ערך באופן ישיר תוך ביצוע Cast/Convert אלא רק ערכים בינאריים (מפורשים או משתנים), למשל: Declare @VrBn Varbinary(128); Set @VrBn=Cast('Hello World' As Varbinary(128)); Set Context_Info @VrBn; שליפת הערך מתוכו נעשית כך: ...
2 תגובות

הכנסת ערכים לעמודת Identity

12/03/2012

עמודות Identity יוצרות בעצמן את הערכים המאוכלסים בהן: ברירת המחדל היא להתחיל מ-1 ולעלות ב-1 בכל פעם (1,2,3,4..), אך ניתן להגדיר Seed ו-Increment שונים. יחד עם זאת- ניתן להכניס ערכים חיצוניים לעמודות Identity ולהתגבר על ההגדרות, בדרכים מסויימות. Use tempdb;Go If Object_Id('MyTbl','U') Is Not Null Drop Table MyTbl;Go Create Table MyTbl(ID Int Identity, Txt Varchar(Max));Go InsertInto MyTblSelect 'First' Union AllSelect 'Second' Union AllSelect 'Third'; Select * From MyTbl; במקרה זה הוכנסו לטבלה שלוש שורות, לא צויינו ערכים לעמודת ה-Identity, ובפקודת ה-Insert לא היה צורך לציין...
אין תגובות

השימושים השונים ב-Cross Apply (וב-Outer Apply)

04/03/2012

Cross Aplly הוא חלופה משודרגת של Inner Join ולו שימושים מעניינים שלא כולם מוכרים. 1. בתור שכזה ניתן לעשות איתו כל מה שניתן לעשות עם Inner Join ויותר מזה. רוצה לומר שלו נקלע לאי בודד ונוכל לקחת איתנו לשם רק מספר בודד של פקודת SQL – נעדיף לארוז באמתחתנו את ה-Apply ולהשאיר את ה-Join בבית... שתי השליפות הבאות מבצעות אותו הדבר, לשתיהן פלט זהה, וגם Execution Plan זהה: Use AdventureWorks; Go   Select S.name+'.'+O.name FullName ...
תגובה אחת

חישובי מלאי

03/03/2012

ההכרזה הקרובה על SQL Server 2012 היא הזדמנות לבחון את כוחן של פונקציות החלון החדשות בחישובי מלאי. מהם חישובי מלאי? מערכת מלאי אוספת מידע על פריטים שונים- כמה נכנס למחסן, כמה יצא; וכפועל יוצא של זה- כמה יש. כניסות למחסן יכולות להיות סחורה חדשה שנקנתה, מוצרים שהושלמו ונכנסו למחסן תוצרת גמורה, סחורה שחזרה מהלקוח ועוד. יציאות מהמחסן יכולות להיות סחורה שנשלחה ללקוח, חומרי גלם שהוחזרו לספק, אובדן, גניבה ועוד. מערכת מלאי אמיתי אמורה לכלול קודים לגבי כל אחת מהתנועות האלו, אבל אנחנו נסתפק ב-1 (כניסה) ו-2 (יציאה). ...
אין תגובות