תופעות
בעת שימוש בפונקציות SCOPE_IDENTITY()או @@IDENTITY כדילאחזר את הערכים שנוספו לזהות עמודה, ייתכן שתבחין שפונקציות אלה מחזירות לפעמים ערכים שגויים. הבעיה מתרחשת רק כאשר השאילתות שלך משתמשות בתוכניות ביצוע מקבילות. לקבלת מידע נוסף אודות האופן שבו ניתן לקבוע אם השאילתות שלך עומדות להשתמש בתוכניות ביצוע מקבילות, עיין בסעיף מקבילות אינטרא-שאילתה במאמר הטכני הבא בהורדות Microsoft:
סיבה
Microsoft אישרה כי זוהי בעיה במוצרי Microsoft המפורטים בתחילת מאמר זה.
פתרון
מידע עדכון מצטבר
SQL Server 2008 R2 Service Pack 1
התיקון לבעיה זו הופץ לראשונה ב- 5 עדכון מצטבר עבור SQL Server 2008 R2 Service Pack 1. לקבלת מידע נוסף אודות האופן שבו ניתן להשיג חבילת עדכון מצטבר זו, לחץ על מספר המאמר הבא כדי להציג את המאמר הרלוונטי מתוך Microsoft Knowledge Base:
2659694חבילת עדכון מצטבר 5 עבור SQL Server 2008 R2 Service Pack 1
הערה מאחר גירסאות Build הן מצטברות, כל פרסום תיקון חדש מכיל את כל התיקונים החמים ואת כל תיקוני האבטחה שהיו כלולים במהדורה הקודמת של SQL Server 2008 R2. מומלץ לשקול להחיל את מהדורת התיקון העדכנית ביותר המכילה תיקון חם זה. לקבלת מידע נוסף, לחץ על מספר המאמר הבא כדי להציג את המאמר הרלוונטי מתוך Microsoft Knowledge Base:
2567616מהדורות Build של SQL Server 2008 R2 שהופצה לאחר הפצה של SQL Server 2008 R2 Service Pack 1
פתרון
Microsoft ממליצה לא להשתמש באחת מפונקציות אלה בשאילתות שלך כאשר תוכניות מקבילות מעורבות, כי הן אמינות תמיד. במקום זאת, השתמש במשפט OUTPUT של משפט INSERT כדי לאחזר את ערך הזהות כפי שמוצג בדוגמה שלהלן.
דוגמה לשימוש במשפט OUTPUT:
DECLARE @MyNewIdentityValues table(myidvalues int)
להצהיר @A (מפתח ראשי של ID int) הוספה @A (1) להצהיר @B (ID int primary key identity(1,1), B int not null) הוספה @B (1) בחר [RowCount] = @@RowCount, [@@IDENTITY] = @@IDENTITY, [SCOPE_IDENTITY] = SCOPE_IDENTITY() הגדרת פרופיל סטטיסטיקה ב- הוסף ל- _ddr_T פלט inserted.ID לתוך @MyNewIdentityValues בחר b.ID החל @A a צירוף שמאלי @B b ב- b.ID = 1 צירוף שמאלי @B b2 ב- b2. B = -1 צירוף שמאלי _ddr_T t ב- t.T = -1 כאשר לא קיים (בחר * מתוך _ddr_T t2 t2.ID = -1) הגדרת פרופיל סטטיסטיקה כבוי בחר [RowCount] = @@RowCount, [@@IDENTITY] = @@IDENTITY, [SCOPE_IDENTITY] = SCOPE_IDENTITY(), [IDENT_CURRENT] = IDENT_CURRENT('_ddr_T') בחר * מתוך @MyNewIdentityValues עבוראם המצב שלך דורש שתצטרך להשתמש באחת מפונקציות אלה, באפשרותך להשתמש באחת מהשיטות הבאות כדי לפתור את הבעיה.
שיטה 1:
כלול את האפשרות הבאה בשאילתה שלך
OPTION (MAXDOP 1)
הערה:פעולה זו עשויה לפגוע בביצועים של חלק SELECT בשאילתה.
שיטה 2:
קרא את הערך מהחלק SELECT לתוך קבוצת משתנים (או משתנה טבלה בודד) ולאחר מכן הוסף לטבלת היעד עם MAXDOP=1. מאחר שתוכנית INSERT לא תהיה מקבילה, אתה מקבל את הסמנטיקה הנכונה, אך ה- SELECT שלך יהיה מקביל להשגת הביצועים הרצויים.
שיטה 3:
הפעל את המשפט הבא כדי להגדיר את דרגת המקביליות 1 לכל היותר:
sp_configure 'דרגת מקסימום של מקבילות', 1
עבור
קביעת תצורה מחדש באמצעות עקיפה
עבור
הערה:שיטה זו עלולה לגרום לשפלת ביצועים בשרת. אין להשתמש בשיטה זו אלא אם הערכת אותה בסביבה בדיקה או אחסון זמני.