تخطي إلى المحتوى الرئيسي
الدعم
تسجيل الدخول باستخدام حساب Microsoft
تسجيل الدخول أو إنشاء حساب.
مرحباً،
تحديد استخدام حساب مختلف!
لديك حسابات متعددة
اختر الحساب الذي تريد تسجيل الدخول باستخدامه.

الأعراض

عند استخدام دالات SCOPE_IDENTITY() أو @@IDENTITY لاسترداد القيم المدرجة في عمود هوية، قد تلاحظ أن هذه الدالات تقوم في بعض الأحيان بإرجاع قيم غير صحيحة. تحدث المشكلة فقط عندما تستخدم الاستعلامات خطط التنفيذ المتوازية. لمزيد من المعلومات حول كيفية تحديد ما إذا كانت الاستعلامات ستستخدم خطط التنفيذ المتوازية، يمكنك الرجوع إلى قسم التوازي بين الاستعلامات في المقالة التقنية التالية حول تنزيلات Microsoft:

السبب

لقد تأكدت Microsoft من أن هذه مشكلة في منتجات Microsoft المدرجة في بداية هذه المقالة.

الحل

معلومات التحديث التراكمي

SQL Server 2008 R2 Service Pack 1

تم إصدار تصحيح هذه المشكلة أولا في التحديث التراكمي 5 ل SQL Server 2008 R2 Service Pack 1. لمزيد من المعلومات حول كيفية الحصول على حزمة التحديث التراكمي هذه، انقر فوق رقم المقالة التالية لعرض المقالة في قاعدة معارف Microsoft: 

2659694حزمة التحديث التراكمي 5 ل SQL Server 2008 R2 Service Pack 1

ملاحظة نظرا لأن الإصدارات تراكمية، يحتوي كل إصدار إصلاح جديد على جميع الإصلاحات وجميع إصلاحات الأمان التي تم تضمينها مع إصدار إصلاح SQL Server 2008 R2 السابق. نوصيك بأن تفكر في تطبيق إصدار الإصلاح الأخير الذي يحتوي على هذه الإصلاحية. للمزيد من المعلومات، انقر فوق رقم المقالة التالي لعرضها في "قاعدة معارف Microsoft":

2567616إصدار SQL Server 2008 R2 الذي تم إصداره بعد إصدار SQL Server 2008 R2 Service Pack 1

الحل البديل

توصي Microsoft بعدم استخدام أي من هاتين الدالتين في الاستعلامات عندما تكون الخطط المتوازية مفعلة لأنها غير موثوق بها دائما. بدلا من ذلك، استخدم عبارة OUTPUT من جملة INSERT لاسترداد قيمة الهوية كما هو موضح في المثال أدناه.

مثال لاستخدام عبارة OUTPUT:

DECLARE @MyNewIdentityValues(myidvalues int)
تعريف @A (مفتاح المعرفات int الأساسي)
إدراج في @A (1)
تعريف @B (هوية المفتاح الأساسي لمعرفات int(1,1) وB int not null)
إدراج في @B (1)
حدد
    [RowCount] = @@RowCount،
    [@@IDENTITY] = @@IDENTITY،
    [SCOPE_IDENTITY] = SCOPE_IDENTITY()

تعيين ملف تعريف الإحصائيات على
إدراج في _ddr_T
إخراج inserted.ID إلى @MyNewIdentityValues
    حدد
            
b.ID         من @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

انتقل

إعادة تكوين مع تجاوز

انتقل

ملاحظة:قد يتسبب هذا الأسلوب في حدوث انخفاض في الأداء على الخادم. يجب ألا تستخدم هذه الطريقة إلا إذا قمت بتقييمها في بيئة اختبارية أو بيئة على أساس الترحيل.

مزيد من المعلومات

خطأ Microsoft Connect في هذه المشكلةhttps://docs.microsoft.com/en-us/collaborate/connect-redirect

الحد الأقصى لدرجة التوازي (MAXDOP)https://msdn.microsoft.com/en-us/library/ms181007.aspx

هل تحتاج إلى مزيد من المساعدة؟

الخروج من الخيارات إضافية؟

استكشف مزايا الاشتراك، واستعرض الدورات التدريبية، وتعرف على كيفية تأمين جهازك، والمزيد.

تساعدك المجتمعات على طرح الأسئلة والإجابة عليها، وتقديم الملاحظات، وسماعها من الخبراء ذوي الاطلاع الواسع.

هل كانت المعلومات مفيدة؟

ما مدى رضاك عن جودة اللغة؟
ما الذي أثّر في تجربتك؟
بالضغط على "إرسال"، سيتم استخدام ملاحظاتك لتحسين منتجات Microsoft وخدماتها. سيتمكن مسؤول تكنولوجيا المعلومات لديك من جمع هذه البيانات. بيان الخصوصية.

نشكرك على ملاحظاتك!

×