PracticU

לולאת Foreach ב-SSIS - חלק 5

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

לולאת Foreach ב-SSIS - חלק 5
בהרצאה משלבים For Each Loop על קבצי CSV עם Bulk Insert Task, כדי לטעון את כל הקבצים לטבלה בבת אחת במקום שורה אחר שורה, ואחר כך מעבירים כל קובץ שנקלט לתיקיית ארכיון.
בניית התהליך
1. טבלת יעד: יוצרים עותק של מבנה טבלת Products בלי נתונים, עם select into ועם תנאי שאינו מתקיים לעולם, בשם My New Products. עמודת ה-identity שהועתקה בוטלה ב-Design (Is Identity ל-No).
2. הלולאה: For Each Loop עם שם משלה. Enumerator מסוג קבצים, תיקיית Process, סינון CSV, ושם מלא כולל נתיב וסיומת. ממפים למשתנה file name.
3. Bulk Insert Task: מגדירים חיבור לבסיס הנתונים, טבלת יעד, והפורמט של הקובץ עם הפרדת עמודות בפסיק. מוסיפים חיבור לקובץ אחד, ואז ב-Properties, ב-Expression, מגדירים את ConnectionString לפי המשתנה.
4. טיפוסי נתונים: ההרצה הראשונה נכשלה, כי Bulk Insert דורש התאמה מלאה לקובץ. כל העמודות הוגדרו כ-nvarchar בגודל 20, ואז הטעינה הצליחה.
5. בדיקה: נטענו שבעה קבצים זהים, ולכן כל מוצר הופיע שבע פעמים. הטעינה מהירה יותר מקליטה שורה אחר שורה.
6. ארכיון: כדי שהנתונים לא ייטענו שוב ושוב, מוסיפים File System Task עם הפעולה Move file. המקור נקבע בביטוי לפי המשתנה, והיעד הוא תיקייה קיימת בשם Archive. הקבצים עברו לשם בזה אחר זה.
שימו לב
- Bulk Insert מחייב עמידה מלאה בדרישות הטבלה והקובץ.
- בהרצאה הוא נבחר כדרך נכונה לטעינת קבצים, לעומת תהליך איטרטיבי של שורה אחר שורה.
אחרי ההרצאה אפשר לטעון קבצי CSV רבים לטבלה אחת ולהעביר אותם לארכיון בסיום.
השיעור הבא בקורס: הסבר על Multicast ב-SSIS

פרקי ההרצאה: לולאת Foreach ב-SSIS - חלק 5

  1. 00:00

    Bulk Insert בתוך For Each Loop

  2. 00:38

    הגדרת האינומרטור לקבצי CSV

  3. 01:52

    מיפוי הקובץ למשתנה FileName

  4. 02:28

    יצירת טבלת יעד עם Select Into

  5. 03:27

    הגדרת החיבורים של Bulk Insert Task

  6. 05:21

    Connection String דינמי עם Expression

  7. 06:53

    הרצת הלופ ובדיקת שגיאת הקליטה

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

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

  1. 00:02

    בדוגמה הבאה נדגים עוד שימוש ב-For Each Loop Container, איטרטור כדי לרוץ על סדרה של אובייקטים, גם הפעם אנחנו נרוץ על קבצים בתוך מערכת ההפעלה, אולם על ידי שימוש ב-For Each Loop Container אנחנו נדגים שימוש מחודש בנושא של Bulk Insert Task, היכולת שלנו בעצם לקלוט קבצים, אולם הקליטה שלהם לא תהיה כ-Row by Row אלא

  2. 00:30

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

  3. 00:49

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

  4. 01:18

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

  5. 01:34

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

  6. 01:51

    אם אנחנו רוצים לעשות drill-down ל-Subfolders, כרגע אין לנו שום Subfolders, אנחנו רק רוצים לקחת את הקבצים שנמצאים בתוך Process.

  7. 02:00

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

  8. 02:17

    עד כאן זה הגדרה ברמת הלופ קונטיינר. בפנים מה שאנחנו רוצים לעשות זה bulk insert into products table. לפני שאנחנו עושים זאת בואו נגדיר את מבנה הטבלאה.

  9. 02:29

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

  10. 02:42

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

  11. 02:59

    אני רוצה רק ארכיטקטורה אבל ללא דאטה אז אני כותב תנאי בוליאני כזה שלעולם לא מתקיים. Already exist my new products היא לא קיימת והנה עכשיו אני מקבל מבנה של טבלה.

  12. 03:14

    השם שלה כפי שיצרנו my new products אבל המבנה שלה זהה לחלוטין למבנה של טבלת products ואין בה נתונים מאחר והוספתי כאן את הפסוקית הזאת שכל שורה היא false. אז אנחנו עובדים על טבלת My New Products.

  13. 03:31

    נחזור לתוך התוכנית שלנו, Bulk Insert Products, ואנחנו צריכים לקנפג אותו. ראשית, יוצרים את ה-Connection, לאן אנחנו רוצים להתחבר. אז אנחנו רוצים להתחבר לתוך קובץ, ניצור לעצמנו Connection String לתוך קובץ.

  14. 03:49

    במקרה כאן אנחנו רוצים לקחת את זה מתוך ה-Northwind, אז נתחבר לתוך בסיס נתונים Northwind. Destination שאליו אנחנו רוצים להעתיק זה My New Product, הנה הוא נמצא, כאן זה ה-Destination, כאן מדובר על שם הטבלה שאליה אנחנו רוצים לטעון, זה ה-Destination Connection.

  15. 04:08

    By default אנחנו מקבלים כאן מהו הפורמט של הקובץ. הפורמט מציין שכל שורה בעצם יש בסיומה CourageRetainLineFeed, היא מציינת לנו רשומה בתוך ה-Database והפירוד בתוך הרשומה בין עמודה לעמודה, דיפולט מצוין כאן כקולום דילימטר של תו, אנחנו צריכים לציין את זה מאחר ואנחנו CSV comma Separated,

  16. 04:32

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

  17. 04:51

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

  18. 05:03

    אופשן, במידה ויש לנו הגדרות נוספות, כאן אנחנו כבר יכולים לסיים. ברגע שיצרנו את ה-Connection, את הקובץ שאליו אנחנו רוצים להתחבר וממנו אנחנו רוצים לעשות bulk insert, נוסף לנו כאן בתוך ה-Connection Manager שם של הקובץ שאליו אנחנו רוצים להתחבר.

  19. 05:21

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

  20. 05:34

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

  21. 05:46

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

  22. 06:05

    נשים את זה כאן, Evaluate במידה ויש לנו כאן את הכל, כאן כרגע לא מצוין לי בשם הקובץ את כל הנתיב כולו ולכן אני מקבל רק את השם של הקובץ. נרשום כאן אוקיי, אוקיי, נעמוד על ה-For Each הקודם שלנו שהוא כרגע לא רלוונטי נקטין אותו עוד קטנה קצת כדי לצופף כאן את המקום ואנחנו מדברים על ה-for each

  23. 06:30

    שלנו שיודע לעבור על כל הקבצים עצמם לקחת מהם כפי שמצוין כאן את כל השם את כל הנתיב כולל שם הקובץ כולל הסיומת לטעון אותו לתוך משתנה file name ולאחר מכן כאן בתוך ה-bulk insert לרוץ על אותו או פיין נם ולקלוט אותו לתוך הטבלה.

  24. 06:52

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

  25. 07:02

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

  26. 07:17

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

  27. 07:35

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

  28. 07:46

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

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

ההרצאה הקודמת: לולאת Foreach ב-SSIS - חלק 4

ההרצאה הבאה: הסבר על Multicast ב-SSIS

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

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

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

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