الملخص

يتضمن مشغل قاعدة بيانات Microsoft SQL Server 2016 وقاعدة بيانات SQL Azure التحسينات في تحويلات نوع البيانات أو عمليات أخرى. تقدم معظم هذه التحسينات زيادة الدقة عند العمل مع أنواع الفاصلة العائمة وكذلك مع أنواع التاريخ والوقت التقليدية.

كل هذه التحسينات متوفرة عند استخدام قاعدة بيانات توافق مستوى على الأقل 130. وهذا يعني أن بعض التعبيرات (معظمها غير المألوف)، ستشاهد نتائج مختلفة عن بعض قيم الإدخال بعد ترقية قاعدة البيانات إلى مستوى التوافق 130 أو أعدادا أعلى. هذه النتائج قد تنعكس في هياكل دائمة في قاعدة البيانات، تضمين جدول البيانات التي تخضع لقيود التحقق ، تستمر الأعمدة المحسوبة، فهارس الرجوع إلى الأعمدة المحسوبة والفهارس التي تم تصفيتها وطرق العرض المفهرسة.

إذا كان لديك قاعدة بيانات تم إنشاؤه في إصدار سابق من SQL Server، نوصي بأن تقوم بالتحقق الإضافي بعد الترقية إلى عام 2016 ملقم SQL أو الإصدار الأحدث، وقبل أن تقوم بتغيير مستوى توافق قاعدة البيانات. إذا وجدت أي هياكل دائمة في قاعدة البيانات المتأثرة بهذه التغييرات، نوصي بإعادة بناء الهياكل المتضررة بعد ترقية مستوى توافق قاعدة البيانات. عند القيام بذلك، يمكنك الاستفادة من هذه التحسينات في عام 2016 ملقم SQL أو الإصدار الأحدث.

توضح هذه المقالة بنيات كيف الدائمة في يمكن التحقق من قاعدة البيانات كجزء من الترقية إلى مستوى التوافق 130 أو إعداد أعلى، وأي تأثير هياكل يمكن أن يعاد بناؤها بعد تغيير مستوى التوافق.

خطوات التحقق من الصحة أثناء ترقية مستوى توافق قاعدة البيانات

ابتداء من عام 2016 خادم SQL، كل من ملقم SQL وقاعدة بيانات SQL Azure تتضمن تحسينات على الدقة العمليات التالية:

  • نوع البيانات غير المألوف التحويلات. وهذه تشمل ما يلي:

    • Float/integer to/from datetime/smalldatetime

    • Real/float to/from numeric/money/smallmoney

    • عائم للحقيقي

  • بعض حالات DATEPART/DATEDIFF ودرجة

  • تحويليستخدم نمط فارغة

لاستخدام هذه التحسينات إلى تقييم تعبير في التطبيق الخاص بك، تغيير مستوى التوافق من قواعد البيانات إلى 130 (ل SQL Server 2016) أو 140 (لعام 2017 ملقم SQL وقاعدة بيانات SQL Azure). لمزيد من المعلومات حول كافة التغييرات وبعض الأمثلة التي توضح التغييرات، راجع الملحق أ.

الهياكل التالية في قاعدة البيانات قد تستمر نتائج تعبير:

  • جدول البيانات تخضع التدقيق في القيود

  • الأعمدة المحسوبة الدائمة

  • فهارس تستخدم الأعمدة في المفتاح المحسوبة أو تضمين الأعمدة

  • الفهارس التي تم تصفيتها

  • طرق العرض المفهرسة

اطّلع على السيناريو التالي:

  • لديك قاعدة بيانات التي تم إنشاؤها باستخدام إصدار سابق من SQL Server، أو تم إنشاؤه مسبقاً في عام 2016 ملقم SQL أو إصدار أحدث ولكن في مستوى توافق 120 أو مستوى سابق.

  • يمكنك استخدام أي تعبيرات تم تحسين الدقة التي كجزء من تعريف الهياكل الدائمة في قاعدة البيانات.

في هذا السيناريو، قد يكون استمرار الهياكل التي تتأثر بالتحسينات التي أدخلت على الدقة التي يتم تنفيذها باستخدام مستوى توافق 130 أو أعلى. إذا كان الأمر كذلك، نوصي بأن التحقق من صحة الهياكل الدائمة وإعادة إنشاء أي هيكل يتأثر.

إذا أثرت الهياكل، وعدم إعادة إنشائها بعد تغيير مستوى التوافق، قد تواجه نتائج استعلام مختلفة قليلاً. تعتمد النتائج على ما إذا تم استخدام مؤشر معين أو عمود محسوب أو العرض، وما إذا كانت البيانات الموجودة في جدول يمكن اعتبار انتهاك قيد.

 

ملاحظة: تتبع العلامة 139 في SQL Server

إشارة تتبع العمومية 139 المقدمة في حزمة الخدمة (س) 1 إلى فرض صحة دلالات التحويل في نطاق DBCC التحقق من الأوامر مثل DBCC CHECKDBDBCC CHECKTABLE و DBCC CHECKCONSTRAINTS و CU3 2016 ملقم SQL عندما قمت تحليل دقة وتقديمها مع مستوى التوافق 130 في قاعدة بيانات تحتوي على مستوى توافق سابق منطق التحويل.

 

تحذير

علامة تتبع 139 لا يعني أن يكون ممكناً باستمرار في بيئة إنتاج، ويجب استخدامه لغرض تنفيذ عمليات التحقق من صحة قاعدة البيانات الموضحة في هذه المقالة. ولذلك، يجب تعطيل باستخدام تراسيوف dbcc (139،-1) في الدورة نفسها، إكمال بعد التحقق من الصحة.

علامة تتبع 139 معتمد في CU3 عام 2016 خادم SQL و SQL Server 2016 SP1.

للارتقاء بمستوى التوافق، اتبع الخطوات التالية:

  1. تنفيذ التحقق من الصحة لتحديد أي البنيات الدائمة المتأثرة:

    1. تمكين تتبع العلامة 139 بتشغيل DBCC TRACEON(139,-1)-

    2. تشغيل الأوامر DBCC CHECKDB/الجدول و CHECKCONSTRAINTS .

    3. تعطيل العلامة تتبع 139 بتشغيل DBCC TRACEOFF(139,-1)-

  2. تغيير مستوى توافق قاعدة البيانات إلى 130 (ل SQL Server 2016) أو 140 (لعام 2017 ملقم SQL وقاعدة بيانات SQL Azure).

  3. إعادة إنشاء أي هياكل الذي قمت بتحديده في الخطوة 1.

ملاحظة: تتبع إشارات في قاعدة بيانات SQL Azure

تعيين تتبع إشارات غير معتمد في قاعدة بيانات SQL Azure. ولذلك، يجب تغيير مستوى التوافق قبل إجراء التحقق من الصحة:

  1. ترقية مستوى توافق قاعدة البيانات إلى 140.

  2. تنفيذ التحقق من الصحة لتحديد أي البنيات الدائمة متأثرة.

  3. إعادة بناء الهياكل الذي قمت بتحديده في الخطوة 2.

  • يحتوي على قائمة مفصلة بالتحسينات الدقة التذييل ألف ويعطي مثالاً لكل.

  • يتضمن التذييل باء عملية مفصلة خطوة بخطوة لإجراء التحقق من الصحة وإعادة بناء الهياكل المتأثرة.

  • التذييلات جيم و دال يحتوي على البرامج النصية للمساعدة في تحديد الكائنات التي يحتمل أن تتأثر في قاعدة البيانات. لذلك، يمكن نطاق عمليات التحقق من الصحة الخاص بك وإنشاء البرامج النصية المقابلة لتشغيل الاختبارات. لسهولة تحديد ما إذا كان أي الهياكل الدائمة في قواعد البيانات المتأثرة بدقة التحسينات في مستوى التوافق 130، تشغيل البرنامج النصي في التذييل دال لإثارة التحقق من الصحة الصحيح ثم قم بتشغيل هذا البرنامج النصي إلى إجراء التحقق من الصحة.

 

ملحق أ: التغيرات في مستوى التوافق 130

يوفر هذا الملحق على قوائم تفصيلية لإدخال تحسينات على تقييم تعبير في مستوى التوافق 130. يتضمن كل تغيير استعلام مثال مقترنة. يمكن استخدام الاستعلامات لإظهار الاختلافات بين تنفيذ في قاعدة بيانات يستخدم مستوى توافق قبل 130 بالمقارنة مع قاعدة بيانات تستخدم مستوى توافق 130. 

اكتب البيانات قائمة الجداول التالية التحويلات وعمليات إضافية.

 

من

إلى

تغيير

مثال استعلام

نتيجة لمستوى التوافق < 130

نتيجة لمستوى التوافق = 130

تعويم، حقيقية والأرقام العشرية، الأموال أو أموال صغيرة

التاريخ والوقت أو smalldatetime

زيادة دقة التقريب. سابقا، اليوم والوقت تم تحويلها بشكل منفصل، وتم اقتطاع النتائج قبل أن يمكنك دمجها.

@F FLOAT DECLARE = 1.2

DECLARE التاريخ والوقت @d = @f

حدد CAST(@d AS FLOAT)

1.19999996141975

1.2

التاريخ والوقت

عدد صحيح كبير أو int أو عدد صحيح صغير

قيمة datetime سلبية جزء الوقت الذي تماما نصف يوم أو يتم تقريب في تجزئة لمدة نصف يوم بشكل غير صحيح (النتيجة الخروج بمقدار 1).

التاريخ والوقت @h DECLARE = 0.5-

حدد @h، تحويل (@h ك INT)

0

-1

التاريخ والوقت أو smalldatetime

تعويم، حقيقية والرقمية أو نقود أو أموال صغيرة

تحسين دقة آخر 8 بت الدقة في بعض الحالات.

التاريخ والوقت @p0 DECLARE = '23:58:00.470 1899/12/31'

@F FLOAT DECLARE = تحويل (عدد عشري، @p0)

حدد @f، تحويل (@f ك VARBINARY(8))

-0.00138344907407406، 0xBF56AA9B21D85800

-0.00138344907407407، 0xBF56AA9B21D8583B

عدد عشري

الحقيقي

تدقيقات حدود أقل صرامة.

تحديد تحويل (3.40282347000E + 038 الحقيقي)

تجاوز السعة الحسابية

3.402823 E + 38

الرقمية والمال وأموال صغيرة

عدد عشري

نطاق الإدخال هو صفر، يوجد عند تقريب عدم الدقة عند دمج الأجزاء الأربعة للأرقام.

DECLARE @n الرقمية (38, 0) = 41538374868278625639929991208632320

@F FLOAT DECLARE التحويل (@n كما تعويم) =

حدد CONVERT(BINARY(8)، @f)

0x4720000000000000

0x4720000000000001

الرقمية والمال وأموال صغيرة

عدد عشري

عند إدخال قياس غير صفري، هناك تقريب عدم الدقة عند قسمة 10 ^ المقياس.

DECLARE @n الرقمية (18، 10) = 12345678.0123456781

@F FLOAT DECLARE التحويل (@n كما تعويم) =

حدد CAST(@f AS BINARY(8))

0x41678C29C06522C4

0x41678C29C06522C3

الحقيقي أو عدد عشري

رقمي

تحسين الدقة في بعض الحالات التقريب.

DECLARE عائم @f = 0.14999999999999999

حدد تحويل (@f الرقمية (1, 1))

0.2

0.1

الحقيقي أو عدد عشري

رقمي

تحسين الدقة عند قيامك بتقريب أرقام أكثر من 16 في بعض الحالات.

DECLARE @v عشري (38، 18) 1E 18 =

تحديد @v

0.000000000000000000

0.000000000000000001

الحقيقي أو عدد عشري

الأموال أو أموال صغيرة

تحسين دقة عندما تقوم بتحويل أرقام كبيرة في بعض الحالات.

DECLARE عائم @f = 2SET @f = الطاقة (@f، 49) + الطاقة (@f-2)

حدد CAST(@f AS money)

562949953421312.2048

562949953421312.25

(ن) char (var)

رقمي

إدخال الأحرف أكثر من 39 لم يعد بالضرورة تفعل تجاوز سعة حسابي.

DECLARE @value nchar(100) = '1.11111111111111111111111111111111111111'

حدد CAST(@value AS decimal(2,1))

تجاوز السعة الحسابية

1.1

(ن) char (var)

بت

يدعم الرائدة المسافات وعلامات.

DECLARE @value nvarchar(100) = '1'

حدد CAST(@value AS bit)

فشل التحويل عند تحويل قيمة nvarchar '1' إلى نوع البيانات بت.

1

التاريخ والوقت

الوقت أو التاريخ والوقت 2

تحسين الدقة عند تحويل إلى تاريخ/وقت أنواع ذات الدقة العالية. يجب أن تدرك أن يتم تخزين قيم التاريخ والوقت كعلامات التجزئة التي تمثل 1 ثلاثمائة من الثانية. أحدث الوقت والتاريخ والوقت 2 أنواع تخزين منفصلة عدد الأرقام حيث يطابق عدد الأرقام الدقة.

التاريخ والوقت @value DECLARE = '00:00:00.003 1900/01/01'

حدد CAST(@value AS time(7))

00:00:00.0030000

00:00:00.0033333

الوقت أو التاريخ والوقت 2

التاريخ والوقت

تحسين التقريب في بعض الحالات.

DECLARE @value time(4) = '00:00:00.0045'

حدد CAST(@value AS datetime)

1900-01-01 00:00:00.007

1900-01-01 00:00:00.003

 

العملية

تغيير

مثال استعلام

نتيجة لمستوى التوافق < 130

نتيجة لمستوى التوافق 130

استخدام الدالة المضمنة بالتقدير الدائري أو الدرجات التي تستخدم نوع بيانات رقمية.

درجة قسمة pi/180، حيث أنه سبق مضروبة في 180/pi. مشابهة التقدير الدائري.

@Arg1 DECLARE الرقمية = 1

حدد DEGREES(@arg1)

57.295779513082323000

57.295779513082322865

الإضافة الرقمي أو الطرح عند قياس معامل واحد أكبر من حجم الناتج.

التقريب دائماً تحدث بعد الإضافة/الطرح، بينما سابقا أنه يمكن في بعض الأحيان تحدث من قبل.

DECLARE @p1 الرقمية (38, 2) =-1.15

DECLARE @p2 الرقمية (38, 1) = 10

حدد @p1 + @p2

8.8

8.9

تحويل نمط فارغة .

تحويل نمط فارغة دائماً إرجاع قيمة خالية عندما يكون نوع الهدف الرقمي.

تحديد تحويل (عدد صحيح صغير، '0'، NULL)؛

0

قيمة خالية

DATEPART يستخدم خيار ميكرو ثانية أو نانو ثانية، مع نوع البيانات التاريخ والوقت.

لم يعد يتم اقتطاع القيمة على مستوى مللي ثانية قبل تحويل المشاريع المتناهية الصغر أو نانو ثانية.

DECLARE @dt DATETIME = 00:00:00.003 01-01-1900 '؛

حدد DATEPART(MICROSECOND, @dt)؛

3000

3333

DATEDIFF يستخدم خيار ميكرو ثانية أو نانو ثانية، مع نوع البيانات التاريخ والوقت.

لم يعد يتم اقتطاع القيمة على مستوى مللي ثانية قبل تحويل المشاريع المتناهية الصغر أو نانو ثانية.

التاريخ والوقت @d1 DECLARE = '00:00:00.003 1900/01/01'

التاريخ والوقت @d2 DECLARE = '00:00:00.007 1900/01/01'

حدد DATEDIFF(MICROSECOND, @d1, @d2)

3000

3333

المقارنة بين قيم التاريخ والوقت والتاريخ والوقت 2 ذات القيم غير الصفرية لميلي ثانية.

لم يعد يتم اقتطاع قيمة التاريخ والوقت على مستوى مللي ثانية عند تشغيل مقارنة بقيمة التاريخ والوقت 2. وهذا يعني أن قيم معينة مسبقاً مقارنة المساواة، لم يعد مقارنة المساواة.

التاريخ والوقت @d1 DECLARE = '00:00:00.003 1900/01/01'

DECLARE @d2 DATETIME2(3) = @d1

حدد CAST(@d1 AS datetime2(7)), @d2SELECT CASE WHEN (@d1=@d2) ثم 'المساواة' الانتهاء 'غير متساوية' ELSE

1900-01-01 00:00:00.0030000, 1900-01-01 00:00:00.003

تساوي

1900-01-01 00:00:00.0033333, 1900-01-01 00:00:00.003

غير متساوية

الدالة ROUND التي تستخدم نوع بيانات عشري.

تختلف نتائج التقريب.

تحديد التقريب (التحويل (-0.4175 كما تعويم)، 3)

-0.418

-0.417

 

التذييل "باء: الخطوات" للتحقق من وتحديث الهياكل الدائمة

نوصي بتحديد ما إذا كانت قاعدة البيانات أي الهياكل الدائمة التي تتأثر بالتغيرات في مستوى التوافق 130، وإعادة إنشاء أي هياكل المتأثرة.

انتبهأن هذا ينطبق فقط على الهياكل الدائمة التي تم إنشاؤها في قاعدة البيانات بواسطة إصدار سابق من SQL Server أو باستخدام مستوى توافق أقل من 130. بنيات الدائمة التي يحتمل أن تتأثر تتضمن ما يلي:

  • جدول البيانات تخضع التدقيق في القيود

  • الأعمدة المحسوبة الدائمة

  • فهارس تستخدم الأعمدة في المفتاح المحسوبة أو تضمين الأعمدة

  • الفهارس التي تم تصفيتها

  • طرق العرض المفهرسة

في هذه الحالة، تشغيل الإجراء التالي. 

  1. التحقق من مستوى توافق قاعدة البيانات الخاصة بك باستخدام الإجراء الذي تم توثيقه في عرض أو تغيير مستوى توافق قاعدة بيانات.

  2. إذا كان مستوى توافق قاعدة بيانات أقل من 130، نوصي بتنفيذ التحقق من الصحة التي تم تحديدها في الخطوة 2 قبل زيادة مستوى التوافق إلى 130.

تحديد ما إذا كانت قاعدة البيانات تحتوي على أي الهياكل الدائمة التي تتأثر بدقة ومنطق التحويل في مستوى التوافق 130 في أي من الطرق التالية:

  • DBCC CHECKDB مع EXTENDED_LOGICAL_CHECKS، الذي يتحقق من صحة جميع الهياكل الموجودة في قاعدة البيانات.

  • DBCC CHECKTABLE مع EXTENDED_LOGICAL_CHECKS، الذي يتحقق من الهياكل المرتبطة بجدول واحد.

EXTENDED_LOGICAL_CHECKS مع الخيار مطلوب للتأكد من أن تتم مقارنة قيم دائمة مع القيم المحسوبة، وحيث يوجد اختلاف الحالات العلامة. نظراً لأن هذه الاختبارات الشاملة، أطول من تشغيل عبارات DBCC دون الخيار وقت التشغيل للقوائم DBCC التي تستخدم هذا الخيار. ولذلك، لقواعد البيانات الكبيرة يوصي باستخدام DBCC CHECKTABLE تحديد الجداول الفردية.

يمكن استخدام DBCC CHECKCONSTRAINTS للتحقق من التدقيق في القيود. يمكن استخدام هذه العبارة أما مستوى الجدول أو قاعدة البيانات.

يجب أن تدرك أن الاختيار DBCC * عبارات يجب دائماً تشغيل أثناء أوقات صيانة، بسبب التأثير المحتمل للتدقيق في حمل العمل عبر الإنترنت.

التحقق من صحة مستوى قاعدة البيانات

يتم التحقق من الصحة على مستوى قاعدة بيانات مناسبة لقواعد بيانات صغيرة ومتوسطة الحجم. استخدام التحقق من صحة مستوى الجدول لقواعد البيانات الكبيرة.

DBCC CHECKDB مع EXTENDED_LOGICAL_CHECKSالمستخدمة للتحقق من صحة جميع الهياكل الدائمة في قاعدة البيانات.

DBCC CHECKCONSTRAINTSالمستخدمة للتحقق من صحة كافة القيود التحقق في قاعدة البيانات.

DBCC CHECKCONSTRAINTS

DBCC CHECKCONSTRAINTSالمستخدمة للتحقق من سلامة القيود.

استخدام البرنامج النصي التالي للتحقق من صحة قاعدة البيانات:

استخدام [اسم _ قاعدة البيانات]

الانتقال

TRACEON DBCC (139،-1)

الانتقال

DBCC CHECKCONSTRAINTS

الانتقال

تراسيوف DBCC (139،-1)

الانتقال

استخدام إشارة تتبع التأكد من أن يقوم تجري باستخدام منطق التحويل والدقة المحسنة في توافق 130 فرض الدلالات التحويل الصحيح حتى في حالة قاعدة بيانات مستوى توافق أقل مستوى.

إذا كان البيان الذي CHECKCONSTRAINTS انتهاء ولا يقوم بإرجاع مجموعة نتائج، مطلوب أي إجراء إضافي.

تعد العبارة resultset، كل سطر في النتائج تشير إلى انتهاك قيد، ويتضمن أيضا القيم التي تخالف القيد.

  • حفظ أسماء الجداول والقيود، جنبا إلى جنب مع القيم التي تسبب في انتهاك ('Where' العمود في مجموعة النتائج).

يظهر المثال التالي جدول مع قيد التحقق وصف واحد الذي يحقق قيد ضمن مستويات توافق أقل ولكن التي تخالف القيد تحت مستوى توافق 130.

تغيير قاعدة البيانات الحالي مجموعة COMPATIBILITY_LEVEL = 120

الانتقال

إنشاء جدول dbo.table1

(

تاريخ/وقت c2

تاريخ/وقت c3،

int c4،

الاختيار chk1 القيد (c4 = (DATEDIFF (ms c2, c3)))

)

الانتقال

إدراج قيم dbo.table1 (c2 c3، c4)

(

تحويل (التاريخ والوقت، '00:00:00.997 1900/01/01')،

تحويل (التاريخ والوقت، '1900/01/01 00:00:01')، 3)

الانتقال

TRACEON DBCC (139،-1)

الانتقال

DBCC CHECKCONSTRAINTS

الانتقال

تراسيوف DBCC (139،-1)

الانتقال

تشيككونستراينت الأمر ريتوrns النتائج التالية.

الجدول

القيد

حيث

[dbo].[table1]

[chk1]

[c2] = '00:00:00.997 1900/01/01' [c3] = '00:00:01.000 1900/01/01' جيم [4] = '3'

تشير هذه النتيجة إلى أن تمت مخالفة القيد [chk1] لتركيبة قيم الأعمدة في 'Where'.

CHECKDB DBCC مع EXTENDED_LOGICAL_CHECKS

DBCC CHECKDB مع EXTENDED_LOGICAL_CHECKSبالتحقق من صحة جميع الهياكل الدائمة في قاعدة البيانات. هذا هو الخيار الأكثر ملاءمة لعبارة مفردة بالتحقق من صحة جميع الهياكل الموجودة في قاعدة البيانات. غير أن هذا الخيار غير مناسب لقواعد البيانات الكبيرة بسبب وقت التشغيل المتوقع للعبارة.

استخدام البرنامج النصي التالي للتحقق من صحة قاعدة البيانات بأكملها:

استخدام [اسم _ قاعدة البيانات]

الانتقال

TRACEON DBCC (139،-1)

الانتقال

CHECKDB DBCC مع EXTENDED_LOGICAL_CHECKS، NO_INFOMSGS، تابليريسولتس

الانتقال

تراسيوف DBCC (139،-1)

الانتقال

استخدام إشارة تتبع التأكد من أن يقوم تجري باستخدام منطق التحويل والدقة المحسنة في توافق 130 فرض الدلالات التحويل الصحيح حتى في حالة قاعدة بيانات مستوى توافق أقل مستوى.

إذا تم بنجاح إكمال عبارة CHECKDB ، مطلوب أي إجراء إضافي.

عند الانتهاء من عملية الكشف مع الأخطاء، اتبع الخطوات التالية:

  1. حفظ النتائج من تنفيذ عبارة DBCC ، في الجزء رسائل في SQL Server إدارة Studio (SSMS)، إلى ملف.

  2. التحقق من أي من الأخطاء التي تم الإبلاغ عنها المتعلقة بالهياكل الدائمة

الجدول 1: تستمر الهياكل ورسائل الخطأ المطابق للتناقضات

نوع بنية المتأثرة

ملاحظة رسائل الخطأ

قم بملاحظة

الأعمدة المحسوبة الدائمة

جي إس 2537، 16Table مستوى خطأ: < object_id > معرف الكائن، المعرف < index_id > الفهرس. فشل تدقيق السجل (عمود محسوب صالحة). تكون القيم.

معرف < object_id > الكائن والفهرس معرف < index_id >

الرجوع إلى فهارس الأعمدة في المفتاح المحسوبة أو تضمين الأعمدة

الفهارس التي تم تصفيتها

8951 msg

خطأ جدول: الجدول '< table_name >' (المعرف < object_id >). صف البيانات لم يكن فهرس صف مطابق في الفهرس '< index_name >' (المعرف < index_id >)

And/or

جي إس 8952

خطأ جدول: الجدول '< table_name >' (المعرف < table_name >). فهرس الصف في فهرس '' (معرف < index_id >) لا يطابق أي صف البيانات

وبالإضافة إلى ذلك، قد يكون هناك أخطاء ثانوية 8955 و/أو 8956. يتضمن ذلك تفاصيل حول تأثر الصفوف الدقيق. قد يتم تجاهل لهذه العملية.

معرف < object_id > الكائن والفهرس معرف < index_id >

طرق العرض المفهرسة

جي إس 8908

لا تحتوي طريقة العرض المفهرسة '< view_name >' (معرف الكائن < object_id >) كافة الصفوف التي ينتج عن تعريف طريقة العرض.

And/or

(كائن معرف < object_id >) يحتوي على طريقة عرض مفهرسة 8907The جي إس '< view_name >' الصفوف التي لا تم إنتاجها بواسطة تعريف طريقة العرض.

معرف الكائن < object_id >

بعد الانتهاء من التحقق من صحة مستوى قاعدة بيانات، انتقل إلى الخطوة 3.

التحقق من صحة مستوى الكائن

لقواعد البيانات الكبيرة، من المفيد للتحقق من صحة جدول واحد بنيات والقيود أو عرض واحد في مرة الواحدة لتقليل حجم إطارات الصيانة، أو لتقييد التحقق المنطقي الموسعة فقط على الكائنات التي يحتمل أن تتأثر.

استخدام الاستعلامات في التذييل جيم لتحديد الجداول التي يحتمل أن تتأثر. يمكن استخدام البرنامج النصي في التذييل دال لإنشاء CHECKTABLE والقيود CHECKCONSTRAINTS التي تستند إلى استعلامات المدرجة في التذييل جيم.

DBCC CHECKCONSTRAINTS

للتحقق من صحة القيود المتعلقة بطريقة عرض أو جدول واحد، استخدم البرنامج النصي التالي:

استخدام [اسم _ قاعدة البيانات]

الانتقال

TRACEON DBCC (139،-1)

الانتقال

DBCC CHECKCONSTRAINTS()

الانتقال

تراسيوف DBCC (139،-1)

الانتقال

استخدام إشارة تتبع التأكد من أن يقوم تجري باستخدام منطق التحويل والدقة المحسنة في توافق 130 فرض دلالات تحسن حتى في حالة قاعدة بيانات مستوى توافق أقل مستوى.

إذا كان البيان الذي CHECKCONSTRAINTS انتهاء ولا يقوم بإرجاع مجموعة نتائج، مطلوب أي إجراء إضافي.

العبارة إرجاع مجموعة نتائج، تشير إلى انتهاك قيد كل سطر في النتائج، وتوفر أيضا القيم التي تخالف القيد.

  • حفظ أسماء الجداول والقيود، جنبا إلى جنب مع القيم التي تسبب في انتهاك (أين عمود في مجموعة النتائج).

CHECKTABLE DBCC مع EXTENDED_LOGICAL_CHECKS

للتحقق من صحة استخدام الهياكل الدائمة المتعلقة بجدول مفرد أو عرض البرنامج النصي التالي:

استخدام [اسم _ قاعدة البيانات]

الانتقال

TRACEON DBCC (139،-1)

الانتقال

CHECKTABLE() DBCC مع EXTENDED_LOGICAL_CHECKS، NO_INFOMSGS، تابليريسولتس

الانتقال

تراسيوف DBCC (139،-1)

الانتقال

إذا تم إكمال العبارة CHECKTABLE بنجاح، مطلوب أي إجراء إضافي.

عند الانتهاء من عملية الكشف مع الأخطاء، اتبع الخطوات التالية:

  1. حفظ النتائج من تنفيذ عبارة DBCC ، في الجزء رسائل في SSMS، إلى ملف.

  2. تأكد من أن أي من الأخطاء التي تم الإبلاغ عنها تتصل الهياكل الدائمة كما هو موضح في الجدول 1.

بعد الانتهاء من التحقق من صحة مستوى الجدول، انتقل إلى الخطوة 3.

إذا كان مستوى توافق قاعدة 130، يمكنك تخطي هذه الخطوة.

يمكن تغيير مستوى توافق قاعدة البيانات إلى 130 باستخدام البرنامج النصي التالي:

استخدام [اسم _ قاعدة البيانات]

الانتقال

تغيير قاعدة البيانات الحالي مجموعة COMPATIBILITY_LEVEL = 130

الانتقال

ملاحظة

نظراً لوجود تغييرات محسن الاستعلام ضمن مستوى التوافق 130، نوصي بتمكين مخزن الاستعلام قبل أن تقوم بتغيير مستوى التوافق. لمزيد من المعلومات، راجع الحفاظ على استقرار الأداء أثناء الترقية إلى عام 2016 ملقم SQL.

إذا تم العثور على لم حالات عدم تناسق أثناء التحقق من الصحة في الخطوة 2، يمكنك القيام بالترقية وتخطي هذه الخطوة.

إذا تم العثور على حالات عدم تناسق في الخطوة 2، إجراءات إضافية مطلوبة لإزالة التناقضات من قاعدة البيانات. تعتمد الإجراءات المطلوبة على نوع بنية المتأثر.

هام

القيام بإجراءات الإصلاح في هذه الخطوة فقط بعد أن يتم تغيير مستوى توافق قاعدة البيانات إلى 130.

النسخ الاحتياطي لقاعدة البيانات (أو قواعد البيانات)

نوصي بأخذ نسخة احتياطية من قاعدة بيانات كاملة قبل تنفيذ أي من الإجراءات الموضحة في القسم التالي. إذا كنت تستخدم قاعدة بيانات SQL Azure، ليس عليك أخذ نسخة احتياطية نفسك؛ يمكنك دائماً استخدام وظيفة استعادة نقطة في الوقت المناسب للعودة في الوقت المناسب في حالة حدوث أي خطأ بأي من التحديثات.

قيود التحقق من الصحة

يتطلب تصحيح الانتهاكات قيد التحقق من تعديل البيانات في الجدول أو قيد التحقق نفسه.

اسم القيد (التي تم الحصول عليها في الخطوة 2)، يمكنك الحصول على تعريف قيد كما يلي:

Sys.check_constraints من تحديد تعريف

أين object_id = OBJECT_ID(N'constraint_name')

لفحص صفوف الجدول المتأثرة، يمكنك استخدام أين المعلومات التي تم إرجاعها مسبقاً بالعبارة DBCC CHECKCONSTRAINTS :

حدد *

من [schema_name]. [table_name]

حيث Where_clause

يجب عليك تحديث الصفوف المتأثرة أو تغيير تعريف قيد للتأكد من عدم انتهاك القيد.

تحديث بيانات الجدول

هناك قاعدة صلبة لم توضح كيف يمكن تحديث البيانات. وبوجه عام، لكل مكان آخر عبارة تم إرجاعها بواسطة DBCC CHECKCONSTRAINTS، سيتم تشغيل عبارة التحديث التالية:

تحديث [schema_name]. [table_name] مجموعة new_column_values

حيث Where_clause

خذ بعين الاعتبار الجدول المثال التالي بقيد وصف يخالف القيد في مستوى التوافق 130:

تغيير قاعدة البيانات الحالي مجموعة COMPATIBILITY_LEVEL = 120

الانتقال

إنشاء جدول dbo.table1

(

تاريخ/وقت c2

تاريخ/وقت c3،

int c4،

الاختيار chk1 القيد (c4 = (DATEDIFF (ms c2, c3)))

)

الانتقال

إدراج قيم dbo.table1 (c2 c3، c4)

(تحويل (التاريخ والوقت، '00:00:00.997 1900/01/01')،

تحويل (التاريخ والوقت، '1900/01/01 00:00:01')، 3)

الانتقال

في هذا المثال، يتم القيد مباشرة: c4 عمود يجب أن يكون مساوياً لتعبير يشتمل c2 و c3. لتحديث الجدول، تعيين هذه القيمة إلى الفئة جيم/4:

تغيير قاعدة البيانات الحالي مجموعة COMPATIBILITY_LEVEL = 130

الانتقال

تحديث c4 مجموعة dbo.table1 = datediff (ms c2, c3)

حيث [c2] = '00:00:00.997 1900/01/01' [c3] = '00:00:01.000 1900/01/01' جيم [4] = '3'

الانتقال

لاحظ أن جملة WHERE المستخدمة في عبارة update يناظر أين المعلومات التي يتم إرجاعها بواسطة DBCC CHECKCONSTRAINTS.

تحديث قيد التحقق من الصحة

لتغيير قيد التحقق ، عليك إسقاط وإعادة إنشائه. نوصي بالقيام كل منهما في نفس الحركة، في حالة وجود أية مشاكل تتعلق بتعريف قيد المحدثة. يمكنك استخدام عبارات SQL التالية:

بدء العملية

تغيير الجدول [schema_name]. [table_name]

إسقاط قيود [constraint_name]

تغيير الجدول [schema_name]. [table_name]

إضافة قيد [constraint_name]

الاختيار (new_constraint_definition)

الالتزام

الانتقال

يقوم المثال التالي بتحديث chk1 القيد في dbo.table1:

بدء العملية

تغيير الجدول dbo.table1

إسقاط قيود chk1

تغيير الجدول dbo.table1

إضافة قيد chk1

التحقق من (c4 < = DATEDIFF (ms c2, c3))

الالتزام

الانتقال

الأعمدة المحسوبة الدائمة

أن أسهل طريقة لتحديث الأعمدة المحسوبة الدائمة هي تحديث أحد الأعمدة المشار إليها بواسطة عمود محسوب. القيمة الجديدة للعمود يمكن نفس القيمة القديمة، حيث أن العملية لا يغير أي بيانات المستخدم.

اتبع هذه الخطوات لكل object_id المتعلقة بأوجه عدم الاتساق في الأعمدة المحسوبة الذي قمت بتدوينه في الخطوة 2.

  1. قم بتحديد الأعمدة المحسوبة:

    • تشغيل الاستعلام التالي استرداد اسم الجدول وأسماء الأعمدة المحسوبة الدائمة ل object_id ملاحظات:

      حدد QUOTENAME(s.name) + N '.' + QUOTENAME(t.name) ك 'جدول'

      QUOTENAME(c1.name) ك 'عمود محسوب الدائمة'،

      c1.column_id ك 'computed_column_id'

      تعريف ك 'computed_column_definition'

      من sys.tables t

      وصل sys.computed_columns t.object_id=c1.object_id على c1

      و c1.is_persisted=1

      ربط sys.schemas s t.schema_id=s.schema_id

      أين t.object_id=object_id

  2. قم بتحديد الأعمدة المشار إليها:

    • تشغيل الاستعلام التالي لتعريف الأعمدة التي يتم الرجوع إليها بواسطة عمود محسوب. قم بتدوين أحد referenced_column_names:

      حدد QUOTENAME(s.name) + N '.' + QUOTENAME(o.name) ك 'المرجعي الكائن'،

      o.type_desc ك 'نوع الكائن'، referenced_minor_id ك 'referenced_column_id'، c.name ك 'referenced_column_name'

      من حوار sys.sql_expression_dependencies

      صلة sys.computed_columns c1 في sed.referencing_id=c1.object_id sed.referencing_minor_id=c1.column_id

      وصل sed.referencing_id=o.object_id في س sys.objects

      الانضمام إلى o.schema_id=s.schema_id على sys.schemas s

      Sys.columns الصلة c على o.object_id=c.object_id sed.referenced_minor_id=c.column_id

      أين referencing_class = 1 referenced_class = 1 referencing_id = object_id referencing_minor_id = computed_column_id

  3. قم بتشغيل عبارة التحديث التي تنطوي على أحد الأعمدة المشار إليها إلى تشغيل تحديث عمود محسوب:

    • وسوف يؤدي العبارة التالية تحديث العمود الذي تتم الإشارة إلى عمود محسوب وأيضا تشغيل تحديث عمود محسوب.

      تحديث [schema_name]. [table_name]

      مجموعة referenced_column_name = ISNULL (referenced_column_name، referenced_column_name)

    • يصاغ التعبير ISNULL في البيان طريقة أن قيمة العمود الأصلي لا يتغير مع الاحتفاظ بالتأكد من أنه يتم تحديث العمود المحسوب باستخدام منطق تقييم التعبير مستوى 130 توافق DB.

    • يجب أن تدرك أن لجداول كبيرة جداً، قد لا تحتاج إلى تحديث كافة الصفوف في عملية واحدة. وفي هذه حالة، أنه يمكنك تشغيل التحديث على دفعات بإضافة جملة where لعبارة update التي تحدد مجموعة الصفوف; استناداً إلى المفتاح الأساسي، على سبيل المثال.

  4. تحديد الأرقام القياسية للإشارة إلى عمود محسوب.

    حدد i.name [اسم الفهرس]

    من sys.index_columns ic الانضمام sys.indexes أنا على ic.object_id=i.object_id ic.index_id=i.index_id

    أين i.object_id=object_id ic.column_id=computed_column_id

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

الفهارس والفهارس التي تم تصفيتها وطرق العرض المفهرسة

تقابل أوجه التضارب في الأرقام القياسية لأخطاء 8951 و 8952 (للجداول) أو 8907 و 8908 (لطرق العرض) في إخراج الاختيار DBCC * الخطوة 2.

لإصلاح حالات عدم الاتساق هذه، قم بتشغيل DBCC CHECKTABLE مع REPAIR_REBUILD. هذا سيتم إصلاح هياكل فهارس دون أي خسارة في البيانات. ومع ذلك، يجب أن يكون في وضع المستخدم المفرد قاعدة البيانات وذلك غير متوفرة للمستخدمين الآخرين أثناء حدوث إصلاح.

يمكنك يدوياً إعادة إنشاء الفهارس المتأثرة. يجب استخدام هذا الخيار إذا كان عبء العمل لا يمكن دون اتصال، يمكن إجراء لإعادة إنشاء الفهرس كعملية عبر إنترنت (في الإصدارات المعتمدة من SQL Server).

إعادة إنشاء الفهارس

إذا تم تعيين قاعدة البيانات في وضع المستخدم المفرد ليس خياراً، يمكن إعادة إنشاء الفهارس على حدة باستخدام "تبديل إعادة إنشاء الفهرس"، لكل فهرس المحددة في الخطوة 2.

استخدام الاستعلام التالي للحصول على أسماء الجداول والفهرس المعطى object_id و index_id.

حدد QUOTENAME(SCHEMA_NAME(o.schema_id)) + N '.' + QUOTENAME(o.name) ك 'جدول'، i.name ك 'index_name'

من sys.objects o الصلة sys.indexes أنا على o.object_id=i.object_id

أين o.object_id = object_id i.index_id = index_id

استخدم العبارة التالية لإعادة إنشاء الفهرس:


ALTER INDEX index_name ON [schema_name].[table_name] REBUILD WITH (ONLINE=ON)

ملاحظة: لا يتم دعم إذا كنت تستخدم القياسي، ويب، أو إنشاء إصدارات Express، الفهرس المحوسب. لذلك، الخيار (على الإنترنت = ON) يجب إزالته من عبارة ALTER index.

يوضح المثال التالي إعادة إنشاء الفهرس التي تمت تصفيتها:

تغيير قاعدة البيانات الحالي مجموعة COMPATIBILITY_LEVEL = 120

الانتقال

إنشاء جدول dbo.table2

(

تاريخ/وقت c2

تعويم c3

)

الانتقال

إدراج قيم dbo.table2 (c2, c3) ('23:58:00.470 1899/12/31'،-0.00138344907407406)

الانتقال

إنشاء فهرس ix_1 على dbo.table2(c2)

حيث (c2 =-0.00138344907407406)

الانتقال

تغيير قاعدة البيانات الحالية تعيين COMPATIBILITY_LEVEL = 130GOALTER ix_1 الفهرس على [dbo]. جدول [2] إعادة إنشاء بواسطة (= ON على الإنترنت)

الانتقال

إذا كان لديك خطط الصيانة المنتظمة، نوصي بأن تتضمن إعادة إنشاء فهرس هذا كجزء من عملية الصيانة المجدولة الخاصة بك.

باستخدام DBCC

لكل (object_id) المتعلقة بفهرس بعدم الاتساق الذي سجلته في الخطوة 2، تشغيل البرنامج النصي التالي لإجراء الإصلاح. هذا البرنامج النصي بتعيين قاعدة البيانات في وضع المستخدم المفرد لعملية الإصلاح. وفي أسوأ الحالات، ينفذ الإصلاح إعادة إنشاء فهرس كامل.

استخدام [اسم _ قاعدة البيانات]

الانتقال

تغيير قاعدة البيانات الحالي مجموعة SINGLE_USER بالتراجع الفوري

الانتقال

CHECKTABLE DBCC (object_id REPAIR_REBUILD) مع EXTENDED_LOGICAL_CHECKS، NO_INFOMSGS، تابليريسولتس

الانتقال

تغيير قاعدة البيانات الحالي مجموعة MULTI_USER

الانتقال

الملحق c: استعلامات تحديد جداول الترشيح

البرامج النصية التالية تحديد الجداول المرشحة التي قد تحتاج إلى التحقق من صحة باستخدام CHECKTABLE DBCC مع EXTENDED_LOGICAL_CHECKS، استناداً إلى وجود هياكل دائمة والقيود التي تستخدم أنواع البيانات المتأثرة بالتحسينات التي أدخلت على مستوى التوافق 130.

المجموعة التالية من تفاصيل قائمة الاستعلامات حول الجداول والتي يحتمل أن تتأثر بنيات التي تتطلب التحقق الإضافي.

الاستعلام التالي بإرجاع كافة طرق العرض المفهرسة الرجوع إلى أعمدة باستخدام أنواع البيانات المتأثرة، أو باستخدام أي من الدوال المضمنة المتأثرة:

حدد QUOTENAME(SCHEMA_NAME(o.schema_id)) + N '.' + QUOTENAME(o.name) ك 'عرض'، كما QUOTENAME(i.name) 'index',QUOTENAME(sed.referenced_schema_name) + N'. '+ QUOTENAME(sed.referenced_entity_name) ك' الجدول المشار إليه '، كما QUOTENAME(c.name) العمود المشار إليه '، t.name ك' نوع البيانات '

-إذا كان نوع بيانات رقمية أو عدد صحيح أو المال، التحقق من الحالات الوحيدة التي تضمن إضافية

-DBCC به إذا كان يحتوي على تعريف طريقة العرض عدد عشري أو قيمة التاريخ والوقت أو تحويل إلى مثل هذه القيمة

s.definition

من حوار sys.sql_expression_dependencies

O sys.objects الصلة على sed.referencing_id = o.object_id o.type=N'V '

Sys.indexes الصلة أنا على o.object_id=i.object_id

الانضمام إلى s.object_id=o.object_id على sys.sql_modules s

Sys.columns الصلة c على sed.referenced_id=c.object_id sed.referenced_minor_id=c.column_idJOIN sys.types أ على c.system_type_id=t.system_type_id

أين referencing_class = 1 referenced_class = 1 و (c.system_type_id IN

(59-الحقيقي

، 62-عائم

، 58-smalldatetime

، 61-التاريخ والوقت

، 60-الأموال

، 122-أموال صغيرة

، 106-عشري

، 108-رقمي

، 56-int

، 48-عدد صحيح صغير جداً

، 52-عدد صحيح صغير

، 41 – وقت

، 127-عدد صحيح كبير

) س. أو [تحديد] مثل '% DATEDIFF %'

أو س.] التعريف [مثل '% % تحويل'

أو س.] التعريف [مثل '% % التحويل'

أو س.] التعريف [مثل '% DATEPART %'

أو س.] التعريف [مثل '% % درجة')

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

حدد QUOTENAME(sed.referenced_schema_name) + N '.' +

كما QUOTENAME(sed.referenced_entity_name) 'الجدول الترشيح مع العمود المحسوب'،

QUOTENAME(c1.name) ك 'العمود المحسوب' c1.is_persisted,QUOTENAME(c2.name) 'العمود المشار إليه'، t.name ك 'نوع البيانات'

-إذا كان نوع بيانات رقمية أو عدد صحيح أو المال، التحقق من الحالات الوحيدة التي تضمن إضافية

-DBCC به في حالة تعريف العمود يحتوي على عدد عشري أو قيمة التاريخ والوقت أو تحويل إلى مثل هذه القيمة

c1.definition

من حوار sys.sql_expression_dependencies

صلة sys.computed_columns c1 في sed.referencing_id=c1.object_id sed.referencing_minor_id=c1.column_id

صلة sys.columns c2 sed.referenced_id=c2.object_id sed.referenced_minor_id=c2.column_id

T sys.types الصلة في c2.system_type_id=t.system_type_idWHERE referencing_class referenced_class 1 = = 1

و (c2.system_type_id IN

(59-الحقيقي

، 62-عائم

، 58-smalldatetime

، 61-التاريخ والوقت

، 60-الأموال

، 122-أموال صغيرة

، 106-عشري

، 108-رقمي

، 56-int

، 48-عدد صحيح صغير جداً

، 52-عدد صحيح صغير

، 41 – وقت

، 127-عدد صحيح كبير

) أو c1. [تحديد] مثل '% DATEDIFF %'

أو c1. [تحديد] مثل '% % تحويل'

أو c1. [تحديد] مثل '% DATEPART %'

أو c1. [تحديد] مثل '% % درجة')

و (

-يستمر العمود

c1.is_persisted=1

-أو تضمين العمود في الفهرس

أو موجود (حدد 1 من sys.index_columns ic مكان ic.object_id=c1.object_id ic.column_id=c1.column_id)

)

الاستعلام التالي بإرجاع كافة الجداول مع فهارس المصفاة الرجوع إلى أعمدة في حالة عامل التصفية قد أثرت في أنواع البيانات:

حدد QUOTENAME(sed.referenced_schema_name) + N '.' +

كما QUOTENAME(sed.referenced_entity_name) 'جدول الترشيح بفهرس المصفاة'،

QUOTENAME(i.name) ك 'الرجوع إلى الفهرس'،

QUOTENAME(c.name) ك 'العمود المشار إليه'،

t.name ك 'نوع البيانات'

-إذا كان نوع بيانات رقمية أو عدد صحيح أو المال، التحقق من الحالات الوحيدة التي تضمن إضافية

-مع DBCC من حيث حالة عامل التصفية يحتوي على قيمة عائمة أو التاريخ والوقت

i.filter_definition ك 'حالة عامل التصفية'

من حوار sys.sql_expression_dependencies

Sys.indexes الصلة أنا على sed.referencing_id=i.object_id sed.referencing_minor_id=i.index_id

Sys.columns الصلة c على sed.referenced_id=c.object_id sed.referenced_minor_id=c.column_id

الانضمام إلى c.system_type_id=t.system_type_id على sys.types أ

أين referencing_class 7 AND referenced_class = = 1 i.has_filter=1

و c.system_type_id في (59-الحقيقي

، 62-عائم

، 58-smalldatetime

، 61-التاريخ والوقت

، 60-الأموال

، 122-أموال صغيرة

، 106-عشري

، 108-رقمي

، 56-int

، 48-عدد صحيح صغير جداً

، 52-عدد صحيح صغير

، 41 – وقت

، 127-عدد صحيح كبير

)

 

الاستعلام التالي يسرد كافة الجداول التي تحتوي على قيود التحقق من الصحة التي تشير إلى أنواع البيانات المتأثرة أو دالات مضمنة:

حدد QUOTENAME(sed.referenced_schema_name) + N '.' +

كما QUOTENAME(sed.referenced_entity_name) 'الجدول الترشيح مع قيد التحقق من الصحة'،

C.definition، QUOTENAME(c.name) ك 'constraint_name' ك 'constraint_definition'

QUOTENAME(col.name) ك 'العمود المشار إليه'، t.name ك "نوع البيانات"

من حوار sys.sql_expression_dependencies

Sys.check_constraints الصلة c على sed.referencing_id=c.object_id sed.referencing_class=1

صلة sed.referenced_id=col.object_id في العمود sys.columns sed.referenced_minor_id=col.column_id

الانضمام إلى col.system_type_id=t.system_type_id على sys.types أ

أين referencing_class = 1 referenced_class = 1 و (col.system_type_id IN

(59-الحقيقي

، 62-عائم

، 58-smalldatetime

، 61-التاريخ والوقت

، 60-الأموال

، 122-أموال صغيرة

، 106-عشري

، 108-رقمي

، 56-int

، 48-عدد صحيح صغير جداً

، 52-عدد صحيح صغير

، 41 – وقت

، 127-عدد صحيح كبير)

ج.] التعريف [مثل '% DATEDIFF %' أو

ج.] التعريف [مثل '% % تحويل' أو

ج.] التعريف [مثل '% DATEPART %' أو

ج أو [تحديد] مثل '% % درجة')

 

التذييل دال: برنامج نصي لإنشاء عبارات الاختيار *

 البرنامج النصي التالي ضم الاستعلامات من التذييل السابق ويبسط النتائج عن طريق تقديم قائمة الجداول وطرق العرض في شكل بيانات CHECKCONSTRAINTS و CHECKTABLE .

DECLARE @CRLF nvarchar(10) = CHAR(13) + CHAR(10); DECLARE @sql nvarchar(max) = N'DBCC TRACEON(139,-1); ' + @CRLF ; SELECT @sql += N'DBCC CHECKTABLE (N''' + object_for_checktable + N''') WITH EXTENDED_LOGICAL_CHECKS, NO_INFOMSGS, TABLERESULTS; ' + @CRLF FROM ( --indexed views SELECT DISTINCT QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name) AS 'object_for_checktable' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id AND o.type = N'V' INNER JOIN sys.indexes AS i ON o.object_id = i.object_id INNER JOIN sys.sql_modules AS s ON s.object_id = o.object_id INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id WHERE referencing_class = 1 AND referenced_class=1 AND (c.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint ) OR s.[definition] LIKE N'%DATEDIFF%' OR s.[definition] LIKE N'%CONVERT%' OR s.[definition] LIKE N'%CAST%' OR s.[definition] LIKE N'%DATEPART%' OR s.[definition] LIKE N'%DEGREES%') UNION --persisted computed columns SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.computed_columns AS c1 ON sed.referencing_id = c1.object_id AND sed.referencing_minor_id = c1.column_id INNER JOIN sys.columns AS c2 ON sed.referenced_id=c2.object_id AND sed.referenced_minor_id = c2.column_id INNER JOIN sys.types AS t ON c2.system_type_id = t.system_type_id WHERE referencing_class = 1 AND referenced_class = 1 AND (c2.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint ) OR c1.[definition] LIKE N'%DATEDIFF%' OR c1.[definition] LIKE N'%CONVERT%' OR c1.[definition] LIKE N'%DATEPART%' OR c1.[definition] LIKE N'%DEGREES%') AND ( -- the column is persisted c1.is_persisted = 1 -- OR the column is included in an index OR EXISTS (SELECT 1 FROM sys.index_columns AS ic WHERE ic.object_id = c1.object_id AND ic.column_id=c1.column_id) ) UNION --indexed views SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checktable' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.indexes AS i ON sed.referencing_id = i.object_id AND sed.referencing_minor_id = i.index_id INNER JOIN sys.columns AS c ON sed.referenced_id = c.object_id AND sed.referenced_minor_id = c.column_id INNER JOIN sys.types AS t ON c.system_type_id = t.system_type_id WHERE referencing_class = 7 AND referenced_class = 1 AND i.has_filter = 1 AND c.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint )) AS a SELECT @sql += N'DBCC CHECKCONSTRAINTS (N''' + object_for_checkconstraints + N'''); ' + @CRLF FROM ( SELECT DISTINCT QUOTENAME(sed.referenced_schema_name) + N'.' + QUOTENAME(sed.referenced_entity_name) AS 'object_for_checkconstraints' FROM sys.sql_expression_dependencies AS sed INNER JOIN sys.check_constraints AS c ON sed.referencing_id = c.object_id AND sed.referencing_class = 1 INNER JOIN sys.columns AS col ON sed.referenced_id = col.object_id AND sed.referenced_minor_id = col.column_id INNER JOIN sys.types AS t ON col.system_type_id = t.system_type_id WHERE referencing_class = 1 AND referenced_class = 1 AND (col.system_type_id IN ( 59 --real , 62 --float , 58 --smalldatetime , 61 --datetime , 60 --money , 122 --smallmoney , 106 --decimal , 108 --numeric , 56 --int , 48 --tinyint , 52 -- smallint , 41 --time , 127 --bigint ) OR c.[definition] LIKE N'%DATEDIFF%' OR c.[definition] LIKE N'%CONVERT%' OR c.[definition] LIKE N'%DATEPART%' OR c.[definition] LIKE N'%DEGREES%') ) a SET @sql += N'DBCC TRACEOFF(139,-1);'; PRINT @sql; --to run the script immediately, use the following command: --EXECUTE sp_executesql @sql; GO

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

توسيع المهارات
استكشاف التدريب
الحصول على الميزات الجديدة أولاً
الانضمام إلى Microsoft Insider

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

ما مدى رضاك عن جودة اللغة؟
ما الذي أثّر في تجربتك؟

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

×