
file name, שיחזיק את שם הקובץ.ConnectionString כך שתשתמש במשתנה.file name.file name, ויעד מתוך משתנה חדש destination folder. התיקייה בדוגמה נקראה Process. בסוף כל הקבצים הועברו אליה.DTS Debug Host שנתקעו, ולהריץ שוב.הטקסט המלא של הדקות הראשונות בהרצאה «לולאת Foreach על קבצים ב-SSIS» בקורס הווידאו של PracticU – כתוביות בעברית עם זמן התחלה לכל פסקה. כך תוכלו לקרוא ולחפש את הנושאים לפני שמתחילים ללמוד.
בדוגמה שלפנינו נכיר את For Each Loop Container. בדוגמה הקודמת ראינו מהו Sequence Container, היכולת שלנו לקחת שתי פעולות נפרדות ולהפוך אותן ליחידה אטומית אחת.
בדוגמה הבאה אנחנו ניקח את For Each Loop Container, נזרוק אותו כאן בתוך ה-Control Flow, ונראה את היכולות שלו. ב-For Each Container, כשאנחנו נכנסים כאן להגדיר אותו, יש לנו אפשרות להגדיר מהו ה-Collection, מהו אוסף האובייקטים שעליו אנחנו רוצים לרוץ ולבצע עליו את הפעולות הנדרשות.
לפני שאני נכנס בעומק ההגדרה כאן, אני לוחץ כאן cancel, ובואו נבין מה יש לנו כאן. בתהליך הקודם שעשינו, ביצענו פקודת SQL, הרכיב הראשון, truncate my product stable, זוהי פקודת Execute SQL, שרצה ומעדכנת לנו נתונים בתוך הדאטאבייס, ואילו פרודקטס, כשאני לוחץ עליו דאבל קליק,
אנחנו מגלים שיש לנו כאן רכיב data flow שיודע לקלוט קובץ CSV לבצע עליו מניפולציות שונות כמו Derived Column, Data Conversion, Conditional Split ובסופו של דבר להעתיק אותו לתוך הדאטאבס, להכניס את המידע לתוך הדאטאבס.
בדוגמה שלפנינו אנחנו נרצה לא לקלוט קובץ אחד בודד אלא לקלוט סדרה של קבצים. זאת אומרת את אותו תהליך של פרודקט אנחנו נרצה לבצע בצורה איתרטיבית כלופ שוב ושוב על סדרת הקבצים שאנחנו ניתן.
כדי לבצע זאת אז אנחנו נשתמש ב-for each Loop Container. מה נעשה זאת? נבטל כאן את הקשר שבין הפקודת SQL והפרודקטס, אני מוחק אותו, ניקח את הפרודקטס ונשים אותו כאן.
מה הדבר הזה אומר? נקטין כאן את זה. מה הדבר הזה בעצם מבשר לנו? שעל כל סדרת האובייקטים שתכף אנחנו נגדיר אותה כאן בתוך ה-For each Loop Container אנחנו נעשה Loop Files, נעבור על הקבצים ועל כל קובץ נפעיל את האובייקט הזה, את ה-Data Flow הזה שנקרא Products.
כדי לבצע זאת אנחנו צריכים לייצר כאן משתנה מקומי. לא מדובר בפרמטר, פרמטר זה משהו שנשלח לנו מחוץ ל-SSS, מחוץ ל-DTS, מחוץ לתהליך, לפקאג' עצמו, אלא משהו שהוא פנימי שישרת אותנו על מנת שהפרודקטס ידע לעבוד עליו.
כדי לעשות זאת אנחנו נגדיר משתנה. כיצד מגדירים משתנה? בשטח ריק בתוך ה-Control Flow אני לוחץ קליק ימני ומחפש כאן את Variables. בתוך Variables לוחץ על Add Variables.
לחלופין יכולתי להגיע למסך הזה כאן, מהפינה השמאלית העליונה כפי שניתן לראות למעלה. מהפינה הזאת אני יכול ללחוץ על הכפתור כאן ולחפש את Add Variables. נוסיף כאן משתנה, המשתנה שלנו בעצם יחזיק לנו את שם הקובץ ולכן נקרא לו פייל נייים והדאטה טייפ שלו הסוג של אותו משתנה קובץ זה יהיה סטרינג.
נסגור את המסך ואנחנו עובדים מכאן ואילך עם המשתנה פייל נייים. מה זה אומר? בתוך פרודקטס יש לנו חיבור לתוך הקובץ עצמו. החיבור, הקונקשן שאיתו אנחנו מתחברים נקרא flat file connection manager.
מכאן הוא מוגדר. אם ניכנס בתוך ה-Connections Manager ונחפש את אותו Flat File Connection Manager, הנה, נמצא אותו כאן. יש לו הגדרות ל-Connection String הזה.
לאיזה קובץ הוא מתחבר, ומה הוא עושה איתו, ומה הפורמט שלו, ומה ה-Delimited שלו, וכו' וכו', כל הפרמטרים בהתחברות לאותו קובץ טקסט, לאותו קובץ CSV.
אנחנו רואים שאת הקובץ הוא מחפש בנתיב עצמו, וזה שם הקובץ. אנחנו לא רוצים שזה יהיה שם הקובץ. אנחנו רוצים לספק את אותו שם של קובץ. כיצד נעשה זאת?
נגדיר לאותו אובייקט שיש לו פרמטר. קליק ימני, parameterized. לחלופין, ניתן לעשות זאת במקום אחר. קליק ימני על אותו קונקשן, ולאחר מכן ללחוץ על properties.
כשאני נכנס ל-properties אני רואה את כל המאפיינים שרשומים עבור אותו קונקשן, כשאחד מהמאפיינים זה ה-expression, זו היכולת שלי בעצם לקנפג פרמטרים בצורה של לוגיקה או של פקודה.
נפתח כאן את השלוש נקודות, וכאן ביכולת שלנו לבחור את כל אחד מהפרמטרים שאנחנו נרצה להגדיר עבור אותו קונקשן. אחד מהפרמטרים שכרגע מעניין אותנו זה לקחת את שם הקובץ.
כיצד נקרא אותו פרמטר של שם קובץ? אנחנו נוכל לדעת זאת אם נסתכל כאן בתוך המאפיינים של ה-Connection Manager ונראה ששם הקובץ נכנס תחת הכותרת של Connection String.
הווה אומר שאם אני אלך כאן ונגדיר כאן את אותו פרמטר של קונקשן סטרינג, אני אוכל לתת לו כאן את הביטוי שאני רוצה. אני לא רוצה שהוא יהיה hardcoded וילך לאותו נתיב ולאותו קובץ, אני רוצה שהוא ישתמש לי בתוך שם של משתנה.
ולכן מה שאני עושה, אני נכנס כאן לשלוש נקודות תחת אקספרשן, בוחר כאן את ה-variables המתאים, user variables שזה אחתה יצרנו, ומושך אותו לתוך האקספרשן.
אם נעשה לו כרגע evaluate expression הוא כרגע ריק, אין בו כלום. אבל אם נדע למלא את הקובץ הזה בהתאמה ונקרא לתהליך הזה של פרודקטס, נדע כל פעם להריץ את אותו תהליך עם שם של קובץ שונה.
אז כאמור, בשלב הזה הגדרנו לעצמנו תהליך שלא קורא את הקובץ בצורה של hardcoded תמיד את אותו קובץ, אלא קורא לנו את הפרמטר. כל מה שאנחנו צריכים בתהליך ה-for each loop ללכת ולהגדיר את אותו משתנה, לשלוח אותו כאינפוט לתוך התהליך של פרודקטס.
כדי לעשות זאת אני עומד כאן על הקונטיינר ולוחץ עליו דאבל קליק על מנת לקנפג אותו. בקינפוג שלו קודם כל אנחנו יכולים לשנות את השם שלו, את ה-Description.
בתוך ה-Collection אנחנו יכולים להחליט מהי קבוצת האוכלוסייה שעליה אנחנו רוצים להתייחס, שעליה אנחנו רוצים לעשות לופינג. תחת אינומרטור יש לי מגוון רחב של דברים שאפשר לעבור עליהם, שניתן לבצע עליהם לופינג.
אני יכול לעבור על אובייקטים בתוך הדאטאבייס, אני יכול לעבוד על נודליסט, אני יכול גם לעבוד, כמו בדוגמה שלנו, על for each file enumerator.
זאת אומרת שמתוך הבחירה שלי כאן, כפי שאתם רואים בתוך הרשימת בחירה, אנחנו יכולים לקחת את ה-for each file enumerator, האפשרות השנייה לעבור על כל אחד מהקבצים.
אוקיי, מיד קופץ ושואל אותי: אתה רוצה לעבור על כל אחד מהקבצים? תיתן לי את הנתיב המתאים, היכן נמצאים הקבצים הללו?
יש לתת כאן את הספרייה שבו נמצאים הקבצים. אם נחזור לתוך ה-flat file connection manager ונראה מהיכן הוא קורא את כל הקבצים עצמם, אז נוכל להעתיק רק את הנתיב עצמו שאותו מעניין אותנו.
cancel, דאבל קליק ל-foreach loop כדי לקנפג אותו, קונקשן, לבחור שוב פעם את ה-file enumerator ולתת לו את הנתיב שבו אני רוצה שהוא ימצא את הקבצים.
אני יכול לקחת את כל הקבצים ואני יכול גם לתת כאן פילטר כדי לבחור רק קבצי CSV. לאחר מכן אני יכול לבחור מה אני רוצה כאשר הוא עובר על כל אחד מהקבצים, אני יכול לבחור רק את השם, אני יכול רק את השם פלוס ה-extension, הסיומת של ה-CSV, ואני יכול לקחת את ה-fully qualified, לקחת את כל השם עם כל הנתיב עצמו, שאת כל זה אני אוכל
להכניס ל-Connection String. איך אני אעשה זאת? Variable Mapping. מצד שמאל, האפשרות כאן לעבור ל-Variable Mapping.
כלומר, תעבור לי על כל הקבצים שנמצאים בספרייה הזאת והסיומת שלהם זה קובץ CSV. קח לי קובץ אחר קובץ ואת השם שלו תכניס למשתנה שאני אתן לך.
מהו אותו משתנה שעליו אנחנו מדברים? זה אותו משתנה שיצרנו, User File Name. תכניס את השם של הקובץ לתוך המשתנה עצמו. סיימנו להגדיר כאן את ה-for each Loop.
תחת Expression יש כאן אוסף של Expressionים שניתן להגדיר, כרגע אנחנו לא נכנסים לזה, אבל מה שעשינו כאן זה שני שלבים. בחרנו מבחינת אינומרטור שאנחנו רוצים לעבור על קבצים, בדוגמה שלאחר מכן אנחנו נראה כיצד אנחנו עושים זאת על טבלאות או על אובייקטים אחרים בתוך הדאטאבס.
בתוך ה-Folder בחרנו את הנתיב עצמו שבו נמצאים הקבצים, וכאן עשינו סינון שאנחנו רוצים רק את קבצי CSV.
לפני שנצא, בואו נלך לספרייה עצמה, תכף נפתח אותה כאן. בווייבול עשינו מיפוי ל-file name ובכך סיימנו להגדיר את הלופ.
בואו ניכנס לתוך הנתיב עצמו של הקבצים. כרגע יש לנו קובץ בודד, product.csv. אני רוצה ליצור מספר קבצים ולצורך הפשטות אני אקח אותם, יעתיק את הקובץ וידביק אותו מספר פעמים ctrl+v, ctrl+v, ctrl+v, על מנת לקבל את כל רשימת הקבצים, שכפול של אותו קובץ.
כל אחד מהקבצים הללו אנחנו נעבור בצורה איטרטיבית. כדי לשנות אותם בצורה אחידה, אז בואו נעמוד עליהם, נכתוב את השם שלהם כ-Products.
כשאני משנה כ-Products ולוחץ Enter, המערכת יודעת להוסיף לי את הסיומת של 1, 2, 3 למספר אותם בהתאמה. ובכן, נתונים לנו שבעה קבצים שנמצאים בספרייה הזאת.
שבעת הקבצים הללו, המערכת רצה עליהם בצורה איטרטיבית בזה אחר זה וקולטת אותם למשתנה הזה, פייל ניים. וואנס נקלטים בתוך הפייל ניים, על כל אחד מהם אנחנו מריצים את כל התהליך עצמו.
כאשר התהליך עצמו, אתם רואים את הסימן פונקציה ליד ה-flat file connection manager,