none
פונקציה שמחזירה טבלה RRS feed

  • שאלה

  • שלום רציתי לדעת

    כאשר יש לי פונקציה fn1שמחזירה טבלה

    ובתוכה יש select * from TBL1

    כאשר אני מרחיב את העמוד של הטבלה TB1

    ואני מריץ את fn1 אני לא מקבל את העמודות החדשות שהוספתי

    אם אני אכנס לfn1 אבצע בה שינוי וכן alter

    רק אז אני מקבל את העמודות הנוספות שהוספתי לטבלה TB1

    מה אפשר לעשות כדי לקבל מיד את עמודות הטבלה מהפונקציה ללא alter

    אני עובד על masql 2008 r2  תודה יעקב

    יום רביעי 01 מאי 2013 16:14

תשובות

  • תוספת:

    כדאי לך מאוד לקרוא את 2 הקישורים הבאים לעומק כדי להבין את הנושא.

    השימוש ב:
    Inline Table-Valued Functions

    לעומת השימוש ב:
    Multi-Statement Table-Valued Functions

    קישורים מעולים:

    http://blog.waynesheffield.com/wayne/archive/2012/02/comparing-inline-and-multistatement-table-valued-functions/

    http://stackoverflow.com/questions/2554333/multi-statement-table-valued-function-vs-inline-table-valued-function

    מה שקורה פשוט נשמר לך ב CASH ולכן שינוי הטבלה לא משפיע על הפונקציה.

    הפתרון הוא כפי שכתב מתן שימוש ב sp_refreshsqlmodule לרענון המודלים.

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

    CREATE TRIGGER [Table_T01_Chaged]
    ON DATABASE
    FOR ALTER_TABLE
    AS
    	SET NOCOUNT ON
    	DECLARE @xEvent XML
    	SET @xEvent = eventdata()
    	if
    		convert(nvarchar(100),@xEvent.query('data(/EVENT_INSTANCE/SchemaName)')) + '.' + convert(nvarchar(100),@xEvent.query('data(/EVENT_INSTANCE/ObjectName)'))
    		=
    		'dbo.T01'
    	BEGIN
    		EXEC sys.sp_refreshsqlmodule 'dbo.DynamicTableValuedFunction';
    	END
    GO

    שים לב:

    [Table_T01_Chaged] שם הטריגר

    DynamicTableValuedFunction שם הפונקציה שרוצים לבצע לה רענון

    T01 שם הטבלה שכאשר היא משתנה אז רוצים לבצע את הרענון

    * הבעיה בטריגר תמיד ההשלכות שיש לו אם כי טריגר על DDL לא אמור להיות מבוצע הרבה פעמים... הפתרון כמובן צריך להתאים לאפיון המערכת שלך.


    signature

    יום רביעי 01 מאי 2013 20:21
    מנחה דיון
  • היי יעקב,

    נסה את sp_refreshsqlmodule:

    http://msdn.microsoft.com/en-us/library/bb326754.aspx


    My Blog

    יום רביעי 01 מאי 2013 19:38
  • הי יעקב,

    יש לך דוגמת קוד מלאה בתגובה של רונן (pituach) שמופיעה למעלה.

    אם יש לך שאלה יותר ספציפית, נשמח לנסות לענות...

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • סומן כתשובה על-ידי yacov.rachamim יום חמישי 09 מאי 2013 08:50
    יום חמישי 09 מאי 2013 08:45
    מנחה דיון

כל התגובות

  • היי יעקב,

    נסה את sp_refreshsqlmodule:

    http://msdn.microsoft.com/en-us/library/bb326754.aspx


    My Blog

    יום רביעי 01 מאי 2013 19:38
  • תוספת:

    כדאי לך מאוד לקרוא את 2 הקישורים הבאים לעומק כדי להבין את הנושא.

    השימוש ב:
    Inline Table-Valued Functions

    לעומת השימוש ב:
    Multi-Statement Table-Valued Functions

    קישורים מעולים:

    http://blog.waynesheffield.com/wayne/archive/2012/02/comparing-inline-and-multistatement-table-valued-functions/

    http://stackoverflow.com/questions/2554333/multi-statement-table-valued-function-vs-inline-table-valued-function

    מה שקורה פשוט נשמר לך ב CASH ולכן שינוי הטבלה לא משפיע על הפונקציה.

    הפתרון הוא כפי שכתב מתן שימוש ב sp_refreshsqlmodule לרענון המודלים.

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

    CREATE TRIGGER [Table_T01_Chaged]
    ON DATABASE
    FOR ALTER_TABLE
    AS
    	SET NOCOUNT ON
    	DECLARE @xEvent XML
    	SET @xEvent = eventdata()
    	if
    		convert(nvarchar(100),@xEvent.query('data(/EVENT_INSTANCE/SchemaName)')) + '.' + convert(nvarchar(100),@xEvent.query('data(/EVENT_INSTANCE/ObjectName)'))
    		=
    		'dbo.T01'
    	BEGIN
    		EXEC sys.sp_refreshsqlmodule 'dbo.DynamicTableValuedFunction';
    	END
    GO

    שים לב:

    [Table_T01_Chaged] שם הטריגר

    DynamicTableValuedFunction שם הפונקציה שרוצים לבצע לה רענון

    T01 שם הטבלה שכאשר היא משתנה אז רוצים לבצע את הרענון

    * הבעיה בטריגר תמיד ההשלכות שיש לו אם כי טריגר על DDL לא אמור להיות מבוצע הרבה פעמים... הפתרון כמובן צריך להתאים לאפיון המערכת שלך.


    signature

    יום רביעי 01 מאי 2013 20:21
    מנחה דיון
  • מתן הרסת לי את הבלוג :-(
    (בצחוק כמובן)

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


    signature

    יום רביעי 01 מאי 2013 20:30
    מנחה דיון
  • סליחה רונן :)

    מחכה לקרוא את הפוסט בלי קשר..

    מתן


    My Blog

    יום חמישי 02 מאי 2013 13:45
  • הי יעקב,

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

    תודה!

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il
    יום חמישי 09 מאי 2013 04:26
    מנחה דיון
  • תודה על תגובתך 

    איך מגדירים DDL TRIGER 

    תודה 


    יעקב

    יום חמישי 09 מאי 2013 08:09
  • הי יעקב,

    יש לך דוגמת קוד מלאה בתגובה של רונן (pituach) שמופיעה למעלה.

    אם יש לך שאלה יותר ספציפית, נשמח לנסות לענות...

    -----------------------------
    גיא גלנצר
    יועץ ומדריך SQL Server
    Madeira - SQL Server Services
    http://www.madeira.co.il

    • סומן כתשובה על-ידי yacov.rachamim יום חמישי 09 מאי 2013 08:50
    יום חמישי 09 מאי 2013 08:45
    מנחה דיון
  • תודה רבה 

    יעקב

    יום חמישי 09 מאי 2013 08:50
  • יעקוב צהריים טובים

    הרעיון הוא לסמן את התשובות שקיבלת ולא את ההודעה שמזכירה לך לסמן את התשובות אם כי היא מועילה כמובן שווה סימון בהתאם :-) התשובות לשאלה היו שלי ושל מתן...

    הסימון גורר 2 דברים:

    1. מי ששם הודעה ואתה מסמן אותה מקבל ניקוד(בוא לא נזלזל בכך שאנשים אולי מתנדבים לעזור אבל נהנים לראות שהם הצליחו לעזור).

    2. מי שמחפש תשובה להודעה מופנה על ידי מנועי חיפוש פנימיים וחיצוניים להודעה של התשובה שמסומנת.


    signature


    יום חמישי 09 מאי 2013 09:16
    מנחה דיון