none
יצירת View או Function דינאמי RRS feed

  • שאלה

  • שלום רב,

    יש לי בסיס נתונים בו בכל שבוע נוצרת טבלה חדשה ומתעדכנים בה הנתונים מהשבוע הנוכחי (מפאת עומס פירקתי לכמה טבלאות וכך גם Retention יהיה יותר קל),
    אני מעוניין ליצור view שיחזיר לי את הנתונים של החודש האחרון (פחות או יותר) ולכן אני מעוניין להגדיר view שבאופן דינאמי יידע להחזיר union all על חמשת הטבלאות האחרונות.
    אני יודע איך לזהות את השמות של חמשת הטבלאות האחרונות לפי התאריך הנוכחי אבל אני לא יודע איך לגרום ל view להיות דינאמי כך שבכל שבוע התוצאה תשתנה לפי הטבלאות האחרונות.
    הצלחתי ליצור Procedure דינאמי שבו יצרתי שאילתא שמשתנה כתלות בתאריך ועושה Exec sp_executesql על השאילתא.

    האם זה אפשרי ליצור כזה view?

    אם לא, האם אפשרי ליצור Function כזה?

    תודה רבה

    יום שני 12 ינואר 2015 06:55

תשובות

  • הי,

    אין אפשרות להריץ קוד דינמי בתוך View או בתוך פונקציה. אבל מה שאתה יכול לעשות זה לשנות את ה-View בכל פעם. אתה יכול, למשל, ליצור DDL Trigger שירוץ בתגובה ליצירת טבלה חדשה, ובתוך הטריגר להריץ את הפקודה ALTER VIEW על מנת לעדכן את ה-View שישלוף נתונים מחמש הטבלאות האחרונות (כולל הטבלה החדשה).

    מקווה שעזרתי...

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    http://www.madeirasql.com

    • סומן כתשובה על-ידי Motcke יום שלישי 13 ינואר 2015 09:10
    יום שלישי 13 ינואר 2015 07:21
    מנחה דיון

כל התגובות

  • הי,

    אין אפשרות להריץ קוד דינמי בתוך View או בתוך פונקציה. אבל מה שאתה יכול לעשות זה לשנות את ה-View בכל פעם. אתה יכול, למשל, ליצור DDL Trigger שירוץ בתגובה ליצירת טבלה חדשה, ובתוך הטריגר להריץ את הפקודה ALTER VIEW על מנת לעדכן את ה-View שישלוף נתונים מחמש הטבלאות האחרונות (כולל הטבלה החדשה).

    מקווה שעזרתי...

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    http://www.madeirasql.com

    • סומן כתשובה על-ידי Motcke יום שלישי 13 ינואר 2015 09:10
    יום שלישי 13 ינואר 2015 07:21
    מנחה דיון
  • תודה רבה
    אני אשתמש בהצעה שלך רק שאנצל את העובדה שהטבלאות החדשות נוצרות מתוך קוד חיצוני כטריגר לשינוי ה View.
    יום שלישי 13 ינואר 2015 09:10
  • ערב טוב,

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

    http://ariely.info/Blog/tabid/83/EntryId/150/SQL-Server-Tricks-Return-DBCC-output-in-a-View.aspx

    * כמובן שצריך לבדוק אם זו הדרך שמתאימה לך, או שכדאי לעדכן את ה VIEW בכל פעם. בדרך כלל טריגר על DDL לא יוצר כובד מכיוון שאנחנו לא משנים את המבנה של מסד הנתונים בכל דקה ואלו פעולות נדירות יחסית. לכן פתרון של שינוי ה VIEW יכול תוצאות יותר "בטוחות" או "נקיות", ועל אחת כמה וכמה בדרך כלל יותר יעילות משימוש ב openquery למשל. לכן הפתרון שבחרת נשמע הגיוני, אם כי אפשר ליצור VIEW עם שאילתה דינאמית כמו שביקשת במקור.

    >> "מפאת עומס פירקתי לכמה טבלאות"

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

    >> תוספת: שמתי לב ששאלת גם לגבי פונקציה וגם שם התשובה שזה אפשרי (הדרך הכי פשוטה להדגים היא פונקציה CLR למשל, שמבחינת השרת היא מעין קופסא שחורה מבחינות רבות, ומה שחשוב זה הטורים שחוזרים והנתונים המועברים לפונקציה). עם זה, זו לא דרך שהייתי בוחר בה!


    signature   Ronen Ariely
     [Personal Site]    [Blog]    [Facebook]



    יום שלישי 13 ינואר 2015 15:57
    מנחה דיון