ראשי > SQL Server > טבלאות זמניות לפעמים יכולות להיות מתכון לבעיות (ויצא לי חרוז)

טבלאות זמניות לפעמים יכולות להיות מתכון לבעיות (ויצא לי חרוז)

טבלאות זמניות זה דבר נהדר. SQL Server מאפשר לבנות טבלאות זמניות לוקליות (בניגוד לאורקל שתומך רק טבלאות זמניות גלובליות- לפחות בגרסה 11g). אבל ה-scope של הטבלאות הזמניות יכול להיות מבלבל ולכן יש תמיד לתת לטבלאות זמניות שמות משמעותיים ולא משהו שרירותי כמו a#.

להלן דוגמה:

CREATE PROCEDURE a AS

CREATE TABLE #a (x INT);

      INSERT INTO #a VALUES (1);

      EXEC b;

      SELECT * FROM #a;

GO

CREATE PROCEDURE b AS

      CREATE TABLE #a (x INT);

      INSERT INTO #a VALUES (2);

      SELECT * FROM #a;

GO

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

לעומת זאת, מה יקרה אם נכניס להערה את יצירת הטבלה בפרוצדורה b? הנה כך:

ALTER PROCEDURE b AS

      –CREATE TABLE #a (x INT);

      INSERT INTO #a VALUES (2);

      SELECT * FROM #a;

GO

במקרה הזה פעולת ה-insert לטבלה a# שבפרוצדורה b היא לטבלה שנוצרה בפרוצדורה a. כלומר, הטבלה a# היא סוג של "משתנה גלובלי" ומוכרת גם בפרוצדורה היוצרת וגם בפרוצדורות שתחתיה (שנקראות ע"י הפרוצדורה היוצרת).

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

מודעות פרסומת
  1. Justicator
    17/07/2011 ב- 21:18

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

  1. No trackbacks yet.

להשאיר תגובה

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

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s

%d בלוגרים אהבו את זה: