PracticU

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

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

לולאת Foreach ב-SSIS - חלק 3
איך סופרים כמה טבלאות יש בכל בסיס נתונים באינסטנס, באמצעות For Each Loop שעובר על בסיסי הנתונים ושאילתת SQL דינמית שנבנית בכל איטרציה.
השלבים העיקריים
1. המטרה: אותה שאילתה על sys.tables צריכה לרוץ על כל בסיס נתונים בתורו, למשל AdventureWorks2014 ו-Northwind, ולהחזיר את מספר הטבלאות שבו.
2. הלולאה: For Each Loop Container עם Foreach SMO Enumerator וחיבור לשרת. ב-Browse בוחרים את בסיסי הנתונים ומקבלים את השם שלהם. ב-Variable Mapping מגדירים משתנה string בשם db name.
3. Execute SQL Task: מכיוון שאי אפשר לשלוח את שם בסיס הנתונים כפרמטר, בונים שאילתה דינמית: מגדירים משתנה למחרוזת בגודל 1000, מרכיבים ממנה פקודת select count על <שם בסיס הנתונים>.sys.tables ומשרשרים את הפרמטר שמסומן ב-?. אחר כך מריצים אותה עם execute.
4. מיפוי פרמטר: db name כ-varchar בגודל 128, במיקום 0.
5. Result Set: כברירת מחדל הוא None וכפתור Add חסום. משנים ל-Single row, כי מחזירים ערך אחד. את התוצאה ממפים למשתנה integer בשם number.
6. בדיקה: Breakpoint בתחילת כל איטרציה ו-Watch על המשתנים. באיטרציות הופיעו למשל 34 טבלאות, 0 טבלאות ובסיס נתונים אחד עם 8.
טעות נפוצה
הרצה הופסקה בשגיאה שנוגעת לעמודה New Result Name, שאותה Visual Studio מחפש ברירת מחדל. הפתרון היה לתת alias לספירה, cnt, ולכתוב ב-Result Set את cnt כשם העמודה שנשמרת במשתנה.
אחרי ההרצאה אפשר לבנות שאילתה דינמית בתוך לולאה על בסיסי נתונים ולקרוא את תוצאתה למשתנה.
השיעור הבא בקורס: לולאת Foreach ב-SSIS - חלק 4

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

  1. 00:00

    מעבר על מסדי נתונים עם SQL דינמי

  2. 00:40

    ספירת טבלאות בכל מסד נתונים

  3. 01:18

    שאילתה על sys.tables

  4. 02:12

    הגדרת SMO Enumerator למסדי נתונים

  5. 02:52

    הוספת Execute SQL Task ללולאה

  6. 03:49

    בניית שאילתה דינמית במשתנה

  7. 04:48

    מיפוי פרמטר שם המסד

  8. 05:52

    הגדרת Result Set כ-Single Row

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

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

  1. 00:02

    נראה כעת דוגמה נוספת לעבודה עם for each loop container. פעם במקום לעבור על טבלאות אנחנו נעבור על דאטאבייסים והפעם נראה כיצד אנחנו גם משלבים קוד sql דינמי.

  2. 00:18

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

  3. 00:37

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

  4. 01:04

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

  5. 01:23

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

  6. 01:43

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

  7. 01:57

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

  8. 02:12

    הגעתי ל-SSS, בואו נקנפד את האובייקטים שאותם אנחנו רוצים לרוץ. For each loop databases, אז לכן ה-collection שלנו, שאותו אנחנו נבחר, זה ה-SMO enumerator, נתחבר כאן לתוך ה-Connection String, ב-browse נחפש רזולוציה של דאטאבייסים, עבור כל הדאטאבייסים אנחנו לוקחים את השם שלהם,

  9. 02:33

    לוחצים על אוקיי, אוקיי, וכאן ב-variable mapping נסמן לעצמנו מה המשתנה הרלוונטי מבחינתנו. בואו ניצור משתנה חדש, נקרא לו db-name שם הדאטאבייס, הוא יהיה מסוג סטרינג ואליו אנחנו נכניס את כל הערכים שלנו.

  10. 02:54

    E-B-Name מתוך איטרציה שרצה על כל שמות הדאטאבייסים. ואנס קיבלנו את שם הדאטאבייס, אנחנו רוצים להריץ פקודת SQL. אם כך, נוריד כאן את Execute SQL Task.

  11. 03:07

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

  12. 03:22

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

  13. 03:38

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

  14. 03:53

    נגדיר כאן משתנה, שטרודל s, נקצה לו מספיק מקום, 1000, set, נכניס כאן את הפקודה בהתאמה, שבו אנחנו מיוצרים את הפקודה, select count from, נסיים את הפקודה, נוסיף כאן את הסימן שאלה, ולאחר הוספת הסימן שאלה נסיים כאן את הפלוס, סימן שאלה, פלוס, גרש, ובסוף נסיים זאת עם גרש.

  15. 04:23

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

  16. 04:48

    מהו הפרמטר input של התהליך שלנו? פרמטר input זה בעצם שם הטבלה שאותה אנחנו מקבלים מתוך ה-for each loop. הנה, אז נבחר כאן את שם הטבלה. שם הטבלה במקרה שלנו זה db name 1.

  17. 05:02

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

  18. 05:18

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

  19. 05:52

    מה נעשה עם אותו Output? אותו Output אנחנו צריכים לקנפג כאן בחלק של ה-Result Set, כרגע הוא מקוון ל-None, ואם אני אלך לתוך ה-Result Set אני אראה שאני לא יכול ללחוץ כאן על כפתור Add, אין לי שום אפשרות לשחק בכפתור הזה.

  20. 06:08

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

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

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

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

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

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

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

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