PracticU

לולאת Foreach על קבצים ב-SSIS

בלי כתוביותעם כתוביות
PracticU › קורס SSIS › לולאת Foreach על קבצים ב-SSIS
מילון מושגים:
SSIS - רכיב של SQL Server לבניית תהליכי ETL להעברה ולעיבוד של נתונים בין מקורות.
CSV - קובץ טקסט פשוט לאחסון נתונים טבלאיים, שבו הערכים בכל שורה מופרדים בפסיקים.
טבלה - מבנה במסד נתונים שמאחסן נתונים בשורות ועמודות. כל שורה היא רשומה וכל עמודה היא שדה.
לולאה - מבנה בקרה שחוזר על קטע קוד שוב ושוב כל עוד תנאי מתקיים או עבור כל פריט באוסף.
נתיב - מחרוזת שמתארת את מיקומו של קובץ או תיקייה במערכת הקבצים, או כתובת של משאב בתוך אתר.
מערכת קבצים - השיטה שבה מערכת ההפעלה מארגנת, שומרת ומנהלת קבצים ותיקיות על התקן אחסון, למשל NTFS.
Visual Studio - סביבת פיתוח משולבת (IDE) של מיקרוסופט לכתיבה, ניפוי והרצה של קוד, בעיקר בשפות .NET.
דיבאג - תהליך של איתור, הבנה ותיקון תקלות בקוד, לעיתים בעזרת כלי שמאפשר לעצור ולעקוב אחר ריצת התוכנית.

לולאת Foreach על קבצים ב-SSIS
איך קולטים סדרה של קבצי CSV לטבלה באמצעות For Each Loop Container ב-SSIS, במקום קובץ אחד, ואיך מעבירים את הקבצים שכבר טופלו לתיקייה אחרת.
השלבים העיקריים
1. הכנה: מוחקים את החיבור בין Execute SQL שמנקה את הטבלה לבין Data Flow בשם Products, וגוררים את Products לתוך ה-For Each Loop Container. פקודת הניקוי נשארת לפניו.
2. משתנה: ב-Add Variables יוצרים משתנה user מסוג string בשם file name, שיחזיק את שם הקובץ.
3. חיבור לפי משתנה: ה-Flat File Connection Manager קורא קובץ קבוע. בקליק ימני על החיבור, ב-Properties, בשדה Expression, מגדירים את התכונה ConnectionString כך שתשתמש במשתנה.
4. הגדרת הלולאה: בדאבל קליק על הקונטיינר, ב-Collection, בוחרים Foreach File Enumerator, נותנים את התיקייה (הנתיב אפשר להעתיק מהחיבור) ומסננים קבצי CSV. בוחרים אם לקבל שם בלבד, שם עם סיומת או נתיב מלא.
5. מיפוי: ב-Variable Mapping מכניסים את שם הקובץ למשתנה file name.
6. בדיקה עם כמה קבצים: מעתיקים את הקובץ מספר פעמים והמערכת מוסיפה מספרים לשמות, וכך נוצרו שבעה קבצים. נקלטו 71 שורות לטבלה הייחודית, וגם הטבלה השנייה התמלאה.
7. העברה אחרי טיפול: בתוך הלולאה, אחרי Products, מוסיפים File System Task. הפעולה Move file, מקור מתוך המשתנה file name, ויעד מתוך משתנה חדש destination folder. התיקייה בדוגמה נקראה Process. בסוף כל הקבצים הועברו אליה.
תקלות שהופיעו
- בהרצה הופיעה הודעה שהחבילה אפילו לא התחילה, ו-Rebuild הראה שהקובץ בשימוש בתהליך אחר. הפתרון היה לסגור את Visual Studio ב-Task Manager, ב-Details, לסגור את התהליכים DTS Debug Host שנתקעו, ולהריץ שוב.
- ל-File System Task מופיעה שגיאה שהמשתנה ריק. אפשר להתעלם ממנה, כי הקונטיינר ימלא אותו בזמן ההרצה, ולבדיקה אפשר להזין ערכי ברירת מחדל.
אחרי ההרצאה אפשר לקלוט קבצים רבים בלולאה אחת ולהעביר אותם לתיקייה אחרת.
השיעור הבא בקורס: לולאת Foreach ב-SSIS - חלק 1

פרקי ההרצאה: לולאת Foreach על קבצים ב-SSIS

  1. 00:00

    הכרת Foreach Loop Container

  2. 01:13

    הרצת Data Flow על סדרת קבצים

  3. 02:09

    יצירת משתנה File Name

  4. 03:04

    הגדרות Flat File Connection Manager

  5. 04:01

    Expression ל-Connection String

  6. 05:52

    הגדרת File Enumerator בקונטיינר

  7. 07:37

    Variable Mapping לשם הקובץ

  8. 08:45

    שכפול קבצי CSV לבדיקה

תמלול ההרצאה: לולאת Foreach על קבצים ב-SSIS

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

  1. 00:02

    בדוגמה שלפנינו נכיר את For Each Loop Container. בדוגמה הקודמת ראינו מהו Sequence Container, היכולת שלנו לקחת שתי פעולות נפרדות ולהפוך אותן ליחידה אטומית אחת.

  2. 00:13

    בדוגמה הבאה אנחנו ניקח את For Each Loop Container, נזרוק אותו כאן בתוך ה-Control Flow, ונראה את היכולות שלו. ב-For Each Container, כשאנחנו נכנסים כאן להגדיר אותו, יש לנו אפשרות להגדיר מהו ה-Collection, מהו אוסף האובייקטים שעליו אנחנו רוצים לרוץ ולבצע עליו את הפעולות הנדרשות.

  3. 00:34

    לפני שאני נכנס בעומק ההגדרה כאן, אני לוחץ כאן cancel, ובואו נבין מה יש לנו כאן. בתהליך הקודם שעשינו, ביצענו פקודת SQL, הרכיב הראשון, truncate my product stable, זוהי פקודת Execute SQL, שרצה ומעדכנת לנו נתונים בתוך הדאטאבייס, ואילו פרודקטס, כשאני לוחץ עליו דאבל קליק,

  4. 00:53

    אנחנו מגלים שיש לנו כאן רכיב data flow שיודע לקלוט קובץ CSV לבצע עליו מניפולציות שונות כמו Derived Column, Data Conversion, Conditional Split ובסופו של דבר להעתיק אותו לתוך הדאטאבס, להכניס את המידע לתוך הדאטאבס.

  5. 01:10

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

  6. 01:28

    כדי לבצע זאת אז אנחנו נשתמש ב-for each Loop Container. מה נעשה זאת? נבטל כאן את הקשר שבין הפקודת SQL והפרודקטס, אני מוחק אותו, ניקח את הפרודקטס ונשים אותו כאן.

  7. 01:41

    מה הדבר הזה אומר? נקטין כאן את זה. מה הדבר הזה בעצם מבשר לנו? שעל כל סדרת האובייקטים שתכף אנחנו נגדיר אותה כאן בתוך ה-For each Loop Container אנחנו נעשה Loop Files, נעבור על הקבצים ועל כל קובץ נפעיל את האובייקט הזה, את ה-Data Flow הזה שנקרא Products.

  8. 02:06

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

  9. 02:24

    כדי לעשות זאת אנחנו נגדיר משתנה. כיצד מגדירים משתנה? בשטח ריק בתוך ה-Control Flow אני לוחץ קליק ימני ומחפש כאן את Variables. בתוך Variables לוחץ על Add Variables.

  10. 02:37

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

  11. 03:02

    נסגור את המסך ואנחנו עובדים מכאן ואילך עם המשתנה פייל נייים. מה זה אומר? בתוך פרודקטס יש לנו חיבור לתוך הקובץ עצמו. החיבור, הקונקשן שאיתו אנחנו מתחברים נקרא flat file connection manager.

  12. 03:17

    מכאן הוא מוגדר. אם ניכנס בתוך ה-Connections Manager ונחפש את אותו Flat File Connection Manager, הנה, נמצא אותו כאן. יש לו הגדרות ל-Connection String הזה.

  13. 03:28

    לאיזה קובץ הוא מתחבר, ומה הוא עושה איתו, ומה הפורמט שלו, ומה ה-Delimited שלו, וכו' וכו', כל הפרמטרים בהתחברות לאותו קובץ טקסט, לאותו קובץ CSV.

  14. 03:39

    אנחנו רואים שאת הקובץ הוא מחפש בנתיב עצמו, וזה שם הקובץ. אנחנו לא רוצים שזה יהיה שם הקובץ. אנחנו רוצים לספק את אותו שם של קובץ. כיצד נעשה זאת?

  15. 03:51

    נגדיר לאותו אובייקט שיש לו פרמטר. קליק ימני, parameterized. לחלופין, ניתן לעשות זאת במקום אחר. קליק ימני על אותו קונקשן, ולאחר מכן ללחוץ על properties.

  16. 04:04

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

  17. 04:17

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

  18. 04:32

    כיצד נקרא אותו פרמטר של שם קובץ? אנחנו נוכל לדעת זאת אם נסתכל כאן בתוך המאפיינים של ה-Connection Manager ונראה ששם הקובץ נכנס תחת הכותרת של Connection String.

  19. 04:47

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

  20. 05:04

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

  21. 05:16

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

  22. 05:31

    אז כאמור, בשלב הזה הגדרנו לעצמנו תהליך שלא קורא את הקובץ בצורה של hardcoded תמיד את אותו קובץ, אלא קורא לנו את הפרמטר. כל מה שאנחנו צריכים בתהליך ה-for each loop ללכת ולהגדיר את אותו משתנה, לשלוח אותו כאינפוט לתוך התהליך של פרודקטס.

  23. 05:52

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

  24. 06:03

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

  25. 06:21

    אני יכול לעבור על אובייקטים בתוך הדאטאבייס, אני יכול לעבוד על נודליסט, אני יכול גם לעבוד, כמו בדוגמה שלנו, על for each file enumerator.

  26. 06:31

    זאת אומרת שמתוך הבחירה שלי כאן, כפי שאתם רואים בתוך הרשימת בחירה, אנחנו יכולים לקחת את ה-for each file enumerator, האפשרות השנייה לעבור על כל אחד מהקבצים.

  27. 06:44

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

  28. 06:53

    יש לתת כאן את הספרייה שבו נמצאים הקבצים. אם נחזור לתוך ה-flat file connection manager ונראה מהיכן הוא קורא את כל הקבצים עצמם, אז נוכל להעתיק רק את הנתיב עצמו שאותו מעניין אותנו.

  29. 07:09

    cancel, דאבל קליק ל-foreach loop כדי לקנפג אותו, קונקשן, לבחור שוב פעם את ה-file enumerator ולתת לו את הנתיב שבו אני רוצה שהוא ימצא את הקבצים.

  30. 07:23

    אני יכול לקחת את כל הקבצים ואני יכול גם לתת כאן פילטר כדי לבחור רק קבצי CSV. לאחר מכן אני יכול לבחור מה אני רוצה כאשר הוא עובר על כל אחד מהקבצים, אני יכול לבחור רק את השם, אני יכול רק את השם פלוס ה-extension, הסיומת של ה-CSV, ואני יכול לקחת את ה-fully qualified, לקחת את כל השם עם כל הנתיב עצמו, שאת כל זה אני אוכל

  31. 07:45

    להכניס ל-Connection String. איך אני אעשה זאת? Variable Mapping. מצד שמאל, האפשרות כאן לעבור ל-Variable Mapping.

  32. 07:54

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

  33. 08:07

    מהו אותו משתנה שעליו אנחנו מדברים? זה אותו משתנה שיצרנו, User File Name. תכניס את השם של הקובץ לתוך המשתנה עצמו. סיימנו להגדיר כאן את ה-for each Loop.

  34. 08:19

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

  35. 08:36

    בתוך ה-Folder בחרנו את הנתיב עצמו שבו נמצאים הקבצים, וכאן עשינו סינון שאנחנו רוצים רק את קבצי CSV.

  36. 08:45

    לפני שנצא, בואו נלך לספרייה עצמה, תכף נפתח אותה כאן. בווייבול עשינו מיפוי ל-file name ובכך סיימנו להגדיר את הלופ.

  37. 08:55

    בואו ניכנס לתוך הנתיב עצמו של הקבצים. כרגע יש לנו קובץ בודד, product.csv. אני רוצה ליצור מספר קבצים ולצורך הפשטות אני אקח אותם, יעתיק את הקובץ וידביק אותו מספר פעמים ctrl+v, ctrl+v, ctrl+v, על מנת לקבל את כל רשימת הקבצים, שכפול של אותו קובץ.

  38. 09:16

    כל אחד מהקבצים הללו אנחנו נעבור בצורה איטרטיבית. כדי לשנות אותם בצורה אחידה, אז בואו נעמוד עליהם, נכתוב את השם שלהם כ-Products.

  39. 09:28

    כשאני משנה כ-Products ולוחץ Enter, המערכת יודעת להוסיף לי את הסיומת של 1, 2, 3 למספר אותם בהתאמה. ובכן, נתונים לנו שבעה קבצים שנמצאים בספרייה הזאת.

  40. 09:43

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

  41. 09:57

    כאשר התהליך עצמו, אתם רואים את הסימן פונקציה ליד ה-flat file connection manager,

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

ההרצאה הקודמת: לולאת For ב-SSIS - חלק 2

ההרצאה הבאה: לולאת Foreach ב-SSIS - חלק 1

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

  • לולאת foreach
  • פקודת Foreach
  • לולאת Do - While
  • סקריפט עם לולאת for

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

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