PracticU

רכיב Lookup ב-SSIS

בלי כתוביותעם כתוביות
PracticU › קורס SSIS › רכיב Lookup ב-SSIS
מילון מושגים:
SSIS - רכיב של SQL Server לבניית תהליכי ETL להעברה ולעיבוד של נתונים בין מקורות.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
עמודה - שדה בטבלת מסד נתונים שמחזיק ערך מסוג מסוים עבור כל שורה, למשל שם או תאריך.
Integer - סוג נתונים למספר שלם, כלומר מספר ללא חלק עשרוני.
אקסל - תוכנת גיליונות אלקטרוניים של מיקרוסופט לארגון, חישוב וניתוח נתונים בטבלאות ובנוסחאות.
תנאי - ביטוי לוגי בקוד שתוצאתו אמת או שקר, וקובע אילו פקודות יתבצעו בהתאם לערכו.
פרמטר - ערך שמועבר לפונקציה או לפקודה כקלט, ומשפיע על אופן פעולתן ועל התוצאה שהן מחזירות.
Unicode - תקן קידוד תווים אוניברסלי שמכסה את כתבי השפות בעולם, ומאפשר לייצג כמעט כל תו.

רכיב Lookup ב-SSIS
רכיב Lookup בודק, לפני טעינה, אם שורה כבר קיימת ביעד. ההרצאה בונה על זה תהליך שמבדיל בין Insert ל-Update ומדלג על שורות שלא השתנו.
השלבים העיקריים
1. הגדרת Lookup: מחברים אותו לפלט Discontinued false של ה-Conditional Split. בהגדרה הראשונה, Specify how to handle rows with no matching entries, בוחרים Redirect rows to no match output. אפשרויות אחרות: להכשיל, להתעלם או Error Output.
2. חיבור לטבלה: מחברים ל-MyProductDemoDiscontinue, ובלשונית Columns מושכים קו מ-ProductKey ל-ProductKey. אי אפשר להשוות עמודות מסוגים שונים, ולכן משתמשים בעמודה שהומרה ל-integer.
3. עמודות נלוות: מסמנים את Product Name ו-Unit Price לשימוש הלאה ונותנים להם שמות אחרים (match product name, match unit price) כדי להבדיל מהערכים החדשים.
4. שני הפלטים: ה-No Match output נשלח לטבלה לצורך Insert. ה-Match output נשלח ל-Row Sampling שמציג רק מספר שורות. שגיאת שמות כפולים נפתרת בשינוי שם עמודה.
5. בדיקת Insert: אחרי TRUNCATE הוכנסו 69 שורות. בהרצה שנייה כולן הגיעו ל-Match ולא נוסף דבר. שורה חדשה (78, Ice Cream) הוכנסה כשורה אחת ב-No Match.
6. שימו לב לאותיות: פתיחת הקובץ ב-Excel הפכה true ל-TRUE, ואז ה-Conditional Split לא תפס שורות, עד שעדכנו את התנאי.
7. זיהוי שינויים: על ה-Match output מוסיפים Conditional Split שבודק אם שם המוצר שווה לערך בטבלה. שווים הולכים ל-No Update, והשאר ל-Default output לצורך Update.
8. פקודת Update: רכיב OLE DB Command עם UPDATE ... SET ProductName = ? WHERE ProductID = ?. סימני השאלה הם פרמטרים לפי סדר, Param_0 ו-Param_1. ב-Column Mappings ממפים אותם. Unicode מול non-Unicode גרם לשגיאה עד שנבחרה עמודת ה-Unicode.
9. בדיקת מחיר: מוסיפים || לתנאי כדי לבדוק גם Unit Price, ופרמטר שלישי לפקודה. כך ב-Update ירדו מ-71 שורות רק שלוש (שמות) ואחר כך שורה אחת (מחיר), והשאר ל-No Update.
שימו לב
כשבודקים שני שדות לעדכון, התנאי ל-No Update צריך להיות AND ולא OR, כלומר רק כששם ומחיר שווים שניהם אין עדכון.
אחרי ההרצאה אפשר לבנות תהליך שטוען שורות חדשות, מעדכן שורות ששונו ומשאיר את השאר.
השיעור הבא בקורס: הסבר על Data Viewer ב-SSIS

פרקי ההרצאה: רכיב Lookup ב-SSIS

  1. 00:00

    בדיקת קיום נתונים ביעד עם Lookup

  2. 00:54

    טיפול בשורות ללא התאמה

  3. 01:48

    חיבור לטבלה ומיפוי Product Key

  4. 04:14

    שליחת No Match Output לטבלה

  5. 04:48

    הכרת רכיב Row Sampling

  6. 06:58

    הרצה ובדיקת מספר השורות

  7. 08:50

    הוספת רשומות חדשות לקובץ המקור

  8. 13:16

    זיהוי שורות שדורשות Update

תמלול ההרצאה: רכיב Lookup ב-SSIS

הטקסט המלא של הדקות הראשונות בהרצאה «רכיב Lookup ב-SSIS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.

  1. 00:02

    בדוגמה הבאה אנחנו נכיר קומפוננטה נוספת שנקראת לוקאפ. לוקאפ מאפשר לי ברגע שאני מייבא נתונים, לבדוק האם הנתונים עצמם קיימים כבר בתוך היעד, בתוך ה-Destination אשר אליו אנחנו מביאים את הנתונים עצמם.

  2. 00:16

    ניקח את לוקאפ, נשים אותו כאן. לאחר שאנחנו מייבאים את הנתונים קצת נרווח את המקומות עצמם למעלה, Condition and Split. כאן אנחנו רוצים לקלוט את כל אלו אשר ה-Discount שלהם הוא False לתוך הטבלה, אבל מאחר ואני רוצה לקלוט את הנתונים עצמם, אני רוצה לפני זה לבדוק האם הנתונים עצמם קיימים

  3. 00:35

    בתוך הטבלה. כיצד אנחנו עושים זאת? נמשוך את הנתונים מתוך ה-conditional split לתוך ה-lookup. כבר כאן קופץ לי איזה דאטה אנחנו רוצים למשוך, ואנחנו רוצים למשוך את ה-discontinue falls, בזה אנחנו ממשיכים קדימה. אולם בתוך ה-lookup, לפני שאנחנו מביאים את הנתונים לתוך הטבלה

  4. 00:53

    עצמה, אנחנו רוצים לבדוק האם הנתונים עצמם קיימים כבר בתוך הטבלה או שמא לא. בואו נגדיר זאת, ניכנס כאן לתוך הלוקאפ בעצמו, ובתוך הלוקאפ נשאלת השאלה הראשונה Specify how to handle rows with no matching entries.

  5. 01:11

    כלומר, ברגע שלא מצאנו התאמה מול הנתונים בטבלה, יש לנו מספר אפשרויות או להכשיל את הקומפוננט או להתעלם מהשגיאה או לעשות Redirect Rows to No Match Output להזיז את זה לתוך באפר שנקרא No Match או להזיז את זה לתוך באפר Redirect Rows to Error Output.

  6. 01:30

    נבחר להזיז את הנתונים ל-No Match Output. כלומר, נתונים שאנחנו נצליח לעשות להם Matching לתוך הטבלה, שהם קיימים בתוך הטבלה, ותכף נבחר את התנאי שבאמצעותו נעשה את ההתאמה, את ה-Match מול ה-Database, נעביר אותם לתוך Match Output, ואילו נתונים שלא נצליח למצוא להם Matching,

  7. 01:51

    כשלא נמצא את ההתאמה שלהם בתוך הטבלה, נעביר אותם ל-No Match Output. בטאב השני, כאן מצד שמאל, תחבר קונקשן לתוך הדאטאבס, תחבר לתוך הטבלה עצמה, הטבלה עצמה שאליה אנחנו רוצים להתחבר זה My Product Demo Discontinue.

  8. 02:08

    Preview אנחנו יכולים לראות את המידע שקיים כרגע בתוך הטבלה עצמה, ובטאב הבא בתוך קולומס אנחנו צריכים להחליט על בסיס איזו עמודה אנחנו רוצים להחליט האם הנתונים בתוך הטבלה קיימים או לא.

  9. 02:21

    אני בוחר כאן את Product Key ומותח קו לתוך Product Key עצמו, מפינג לתוך Product Key עצמו, מקבל את ההודעת שגיאה cannot map the input column product e to lookup column product k because the data types do not match. אין לנו התאמה מאחר וכאן מדובר על עמודה שהיא אינטג'ר, אז אנחנו חייבים להשוות אליה עמודת אינטג'ר.

  10. 02:44

    בשיעורים הקודמים ראינו כיצד ב-derived column אנחנו לוקחים עמודה ומבצעים עליה מניפולציה על מנת לשנות אותה בהתאם, ויצרנו את product k אינטג'ר על מנת ליצור שתי עמודות שהdata type שלהן הוא שווה.

  11. 02:58

    בשעה שאנחנו מוצאים את ההשוואה ביניהן, אנחנו נבחר לנו שתי עמודות שאותן אנחנו רוצים לבדוק. אנחנו רוצים לבדוק את ה-Product Name ואת ה-Unit Price.

  12. 03:09

    שתי העמודות הללו שאנחנו בוחרים אותן, Product Name ו-Unit Price, בשעה שאנחנו מסמנים אותן, הן יהיו לי כתוצר לוואי מתוך ההשוואה, מתוך ה-Join בין העמודות הללו, אני אוכל לבחור את העמודות Product Name ו-Unit Price.

  13. 03:25

    העמודה הזאת אין לנו בה צורך ולכן נבטל את ה-Check Box. העמודות הללו על מנת לבדל בין הערך שאותו קיבלנו ובין הערך שאותו מצאנו בתוך הדאטאבייס כאן אנחנו נכתוב את ה-match product name מה שנמצא בתוך הטבלה וכאן match unit price על מנת לתת להם שמות שונים בין הדאטה שאיתו הגענו לעומת הדאטה שאותו מצאנו בתוך הטבלה.

  14. 03:51

    נסמן אוקיי והלוקאפ כרגע מקונפג לנו לבצע התאמה על בסיס product ID בין הנתונים שקיימים בתוך הטבלה ובין הנתונים שקיבלנו אותם מתוך ה-conditional split.

  15. 04:06

    מה קורה כעת? עכשיו יש בידינו את הבחירה. את הנתונים עצמם יש לנו שני באפרים, כפי שציינו בתוך הלוקאפ, באפר של match ובאפר של no match.

  16. 04:18

    לכן, כשאני מושך את הנתונים מתוך הלוקאפ לתוך הטבלה עצמה, כבר קופץ לי המסך ואומר לי input-output סלקשן, איזה סלקשן, איזה קבוצת אוכלוסייה אתה רוצה להעתיק לתוך הטבלה.

  17. 04:30

    כמובן, מתוך האוכלוסייה עצמה אני רוצה להעתיק את אלו שהם לא מתאימים, את אלו שלא קיים הפרודקט הידי שלהם בתוך הטבלה, ולכן אני בוחר את ה-No Match Output.

  18. 04:41

    על החץ נרשם לי כאן Lookup No Match Output. אלו הנתונים שאני רוצה להכניס אותם בתוך הטבלה. עם נתונים אחרים שיהיה בתוך לוקאפ, אלו הנתונים שבהם נעשה מאצ'ינג, כלומר הצלחנו למצוא אותם, אנחנו יכולים למשוך אותם למקום אחר.

  19. 04:59

    בואו ניקח אותם בתור קומפוננטה, נכיר כאן קומפוננטה נוספת, ה-Row Sampling. בתוך ה-Row Sampling, אם ניקח עכשיו את הנתונים מתוך ה-Lookup ונמשוך אותם לתוך ה-Row Sampling, אז כאן כבר הוא יודע לבחור לנו את ה-Matching Data Output.

  20. 05:15

    מה קורה בתוך ה-Row Sampling? כאן אנחנו יכולים לקנפג על מנת לראות דגימה של הנתונים עצמם, להראות לנו חלק מהנתונים, כיצד הם נראים ומה אנחנו רוצים לראות בהם.

  21. 05:28

    נעמוד כאן על הודעת שגיאה. The object contains two objects with duplicate names של row sampling data. בואו ניכנס בפנים. ה-row sampling name והעמודות עצמם.

  22. 05:40

    האם יש לנו כאן עמודות שהן חוזרות על עצמם מבחינת המידע? נסרוק כאן בעין את כל רשימת העמודות עצמם. ואם נקרא את ההודעת הערה כאן, ה-following column names are used more than once, וה-unit price.

  23. 05:56

    ה-unit price כאליאסט מופיע לנו בשתי מקומות שונים. מאחר וכאן אנחנו מייבאים את הנתונים ואנחנו מציגים אותם בסופו של דבר כפלט למשתמש, ברור סמפלינג הזה הוא רוצה שיהיה לנו בידול בין הנתונים ויהיה לנו שמות חד ערכיים, אז נקרא לאחד unit price 1 ואת השני נשאיר אותו כמות שהוא.

  24. 06:16

    כעת, אם נרצה להריץ את התהליך, קורה לנו כאן דבר נפלא. אחרי שהבאנו את כל הנתונים עצמם מתוך ה-conditional split, כל אלו שהם discontinued falls, כלומר אלו שאינם מיועדים להמשך מכירה באתר או בחברה, הבאנו אותם לתוך לוקאפ.

  25. 06:36

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

  26. 06:52

    זאת בצורה מדויקת. לפני שאנחנו ניגשים להרצה, בואו נריץ כאן את הטבלה שלנו, הטבלה עצמה שאיתה אנחנו מדברים נקראת My Product Demo Discontinue, נמשוך אותה, נריץ כאן את השאילתא ונגלה שכרגע יש לנו נתונים בתוך הטבלה, נמחק את הנתונים עצמם, טרנקט טייבל,

  27. 07:13

    נריץ את השאילתא, כרגע הטבלה עצמה ריקה ואין בתוכה נתונים. עכשיו אם נריץ את התהליך עצמו, בואו נגלה מה קורה כאן. בשעה שאני מריץ את התהליך אנחנו מגלים כאן שיש לנו אינדיקציה כמה שורות נכנסו לתוך הטבלה.

  28. 07:29

    סך הכל נמצאו בנו-מאץ' 69 שורות. לא נמצאו התאמה, מאחר והטבלה שלי ריקה, ולכן כל השורות נכנסו פנימה לתוך הטבלה עצמה. אם אני אלך לסרוק את הטבלה עכשיו ולתשאל אותה, אנחנו נגלה, כפי שניתן לראות כאן, בדיוק 69 שורות שנכנסו לתוך הטבלה שלנו.

  29. 07:53

    נחזור לתוך ה-SSS פקאג', ואם עכשיו נריץ את התהליך עצמו עוד הפעם, אני שוב פעם לוחץ כאן קליק ימני Execute Task, הפעם בלי לבחוק את הנתונים בתוך הטבלה, כך שהנתונים בטבלה כבר קיימים, אנחנו מגלים להפתעתנו שקורה בדיוק הדבר ההפוך, בעוד שמקודם כל השורות הלכו לאזור של No Match והתעדכנו בתוך הטבלה.

  30. 08:18

    כעת הלוקאפ דיווח לי שהוא מצא את כל הנתונים בטבלה עצמה. יש מאצ'ינג מלא וכל מה שנותר לו כרגע לעשות זה רק לשלוח את זה לרואו סמפלינג. רואו סמפלינג לא עושה כלום מלבד חיווי של מספר שורות שהוא קיבל.

  31. 08:35

    מספר השורות שהוא קיבל אלו הן 69 שורות חדשות שכבר נמצאות בתוך הטבלה ואין צורך לטעון אותן מחדש. נעצור את התהליך עצמו.

  32. 08:47

    וכעת נחזור לתוך הקובץ המקור שלנו, קובץ הנתונים ה-source files שאיתו התחלנו, ונוסיף שם רשומה חדשה ונראה כיצד זה מתעדכן. הקובץ עצמו, רק להזכיר לנו, יש לו נתיב שבו הוא נמצא, ומתוך הנתיב הזה אנחנו יכולים לשלוף את הקובץ עצמו וללכת ולעדכן אותו.

  33. 09:12

    נגיע לתוך הקובץ בעצמו, נפתח אותו על ידי קובץ אקסל, קובץ נפתח לי, ואנחנו מוסיפים כאן ערך נוסף. מהו הערך שאותו אנחנו רוצים להוסיף? זה את מוצר 78. אין לנו צורך להמציא נתונים חדשים, פשוט נעתיק את השורה עצמה, ואת שם המוצר נשנה ל-Ice Cream.

  34. 09:32

    אז הנה הנתונים ערוכים ומוכנים לנו, שורה 78 לא הייתה בתוך הטבלה, וכעת אנחנו מוסיפים אותה. היא נמצאת לי ב-False, זאת אומרת שהיא הולכת לעמודות שאינן, שהן discontinue למכירה, ולכן היא תלך לי, לבחינת השליפה עצמה, לתוך האזור הזה של ה-discontinue false, והיא תגיע לי לכאן, לתוך ה-lookup, וזאת תהיה השורה היחידה שתקבל כאן no match,

  35. 09:57

    ולכן 69 שורות יהיו לי כרגע בתוך ה-match output, ואילו שורה אחת נוספת תהיה לי בתוך ה-no match. נסגור את הקובץ אקסל ונשמור אותו.

  36. 10:08

    נחזור על התהליך עצמו ונריץ כאן את העסק שלנו. התהליך עצמו לאחר מספר שניות מסתיים. ולהפתעתנו, אין שום אינדיקציה או חיווי לגבי מספר השורות שהגיעו ל-No Match Buffer, No Match Output, לעומת אלו של ה-Match Output.

  37. 10:26

    אם נסתכל על החיווי שכן מופיע לנו כאן, אנחנו יכולים לנסות ללמוד היכן קיימת הבעיה. התחלנו ב-78 שורות, לאחר Derived Column שביצענו עליהם מניפולציה, שמרנו על אותו מספר שורות והגענו ל-78, המשכנו עם 78 שורות, אבל משהו קרה בתוך ה-Conditional Split שבעצם גרם למספר השורות כאן להתאפס, שום דבר לא

  38. 10:51

    המשיך קדימה לשום באפר. כיצד הדבר קורה? ניכנס לתוך ה-Conditional Split ונראה מה קרה לנו כאן לתוך הדאטה.

  39. 11:00

    בתוך ה-Conditional Split אנחנו מפצלים את הנתונים בהתאם ל-Discontinue האם הוא True או False. אולם מאחר ופתחנו את הקובץ בתוך קובץ אקסל, הקובץ של הדאטה שלנו פתחנו אותו בתוך קובץ אקסל, הנתונים עצמם הפכו להיות הטרו ופולס נשמרו לי כרגע כאפרקייס, אותיות גדולות.

  40. 11:21

    לכן עלינו להגיע לכאן ולשנות את הטקסט שאותו אנחנו מחפשים, מאחר ומדובר כאן ב-K-sensitivity בניגוד לשפת SQL, ואנחנו מחפשים דווקא את אלו שהטרו והפולס שלהם באותיות גדולות.

  41. 11:34

    שמרתי את זה כאן. לפני שנריץ את התוכנית נחזור לתוך ה-SQL. נוודא שהטבלה שלנו ריקה לחלוטין, אין בה כרגע דאטה. כעת כשנריץ את הנתונים עצמם, נריץ את התהליך עצמו, Executive Task, נראה שהנתונים עצמם שהוספנו, קיבלנו מתוך 78 שורות, המידע שלנו התפצל כדלקמן:

  42. 11:57

    70 שורות הגיעו לכאן ל-No Match, ו-8 שורות הלכו לכאן שמתאימות ל-Discontinue True. נעצור שוב פעם את התהליך, נחזור לקובץ אקסל ונוסיף שם שורה נוספת, מתחת ל-78 נוסיף הפעם שורה נוספת, ב-D של אותה שורה יהיה 79.

  43. 12:17

    הפעם נקרא לזה שוקולד. נשמור, נסגור את הקובץ ונחזור לתוך ה-SSS. הציפייה שלנו כרגע זה לקבל שורה אחת בתוך No Match שתיכנס לתוך הטבלה מחדש, שתתווסף. Execute Task.

  44. 12:33

    והנה התוצאה לפנינו. הלוקאפ עשה את מלאכתו בצורה נאמנה, בצורה נפלאה. מאחר והלוקאפ זיהה שיש לנו עמודה אחת שהיא מצ'ינג ביחס לנתונים בטבלה, שורה אחת, סליחה, זה לא עמודה, שורה אחת שתיכנס כ-insert לתוך הטבלה עצמם, ואילו 70 שורות לא השתנה בהם מאומה.

  45. 12:57

    ולכן, מבחינת ה-product ID, לא השתנה בהם מאומה, ולכן הוא הביא אותם לבאפר השני של ה-match output. יש לנו עוד 8 שורות אחרות שהן נמצאות בכלל בסקשן אחר, שמתוך ה-conditional split הם עברו לנו בכלל לטבלה אחרת.

  46. 13:13

    שורה אחת נוספה לנו ואילו 70 שורות לא נכנסו בכלל מאחר ואין בהם חידוש. אולם גם ה-70 שורות הללו אמנם אין צורך לבצע בהם insert לתוך הטבלה, אבל בהחלט ייתכן שהשתנה בהם המידע.

  47. 13:29

    איך אנחנו נבדוק זאת? תחת רוב סמפל נביא לכאן שוב פעם את ה-conditional split חלוקה בהתאם לתנאים. ניקח מכאן את הבאפר של אלו שהם match, נזכר אותם לתוך ה-conditional split, ובתוך ה-conditional split אנחנו נבדוק, אמנם לא מדובר בשורות חדשות שצריך לבצע להן insert, אבל בהחלט ייתכן שמדובר בשורות שצריך לבצע

  48. 13:55

    להן update. כיצד נעשה זאת? בדיוק בתנאי הבא. נבדוק האם הערך של ה-product name שאותו אנחנו מקבלים, האם הוא זהה בין ה-match product name, אם הוא שווה לאותו ערך שאנחנו קיבלנו המקורי בטבלה של הפרודקטנים המקורי.

  49. 14:16

    במידה והם שווים, זאת אומרת שהנתון כלל לא השתנה ואין לנו מה לעשות לו Update. אז במצב הזה אנחנו לא צריכים לעשות Update, ניקח את זה לתוך באפר של No Update.

  50. 14:29

    כל שאר המקרים שבהם הנתון בין המצ'ינג ובין הפרודקטנים השתנה, השם עצמו השתנה, ניקח אותו כאן לתוך ה-Default Output, ששם אנחנו צריכים לבצע פקודת Update.

  51. 14:43

    נלחץ כאן על אוקיי. לפני שנריץ את התהליך, ניגש לתוך הנתונים שלנו ונבצע בהם קצת שינויים. פתחנו את הקובץ אקסל. את ה-chai שלנו אנחנו רוצים לשנות, והפעם נשנה אותו ל-chai_1, ואת ה-chan גם אותו נשנה והוא יהיה

לקורס המלא: קורס SSIS אונליין

ההרצאה הקודמת: הדגמה של טרנספורמציה של הנתונים ב-SSIS

ההרצאה הבאה: הסבר על Data Viewer ב-SSIS

הרצאות קשורות מקורסים אחרים

  • רכיב ה-TreeView
  • זיהוי מגע בתוך רכיב
  • חיבור של רכיב לטופס עם React Hook

קורסים נוספים במסלול

  • קורס DBA אפליקטיבי - שפת SQL למתחילים
  • קורס NoSQL - MongoDB
  • קורס BI - ניתוח מסדי נתונים - Qlik Sense
  • קורס Power BI