ארכיון

Archive for מרץ, 2011

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

טבלאות זמניות זה דבר נהדר. 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# היא סוג של "משתנה גלובלי" ומוכרת גם בפרוצדורה היוצרת וגם בפרוצדורות שתחתיה (שנקראות ע"י הפרוצדורה היוצרת).

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