سؤال

هذا هو التكوين الخاص بي:

  • لديّ برنامج نصي دفعي قابل للتشغيل الذي أستخدمه لتحديث قاعدة البيانات الخاصة بي.
  • داخل هذا البرنامج النصي الدُفعات ، لدي رمز يقول ما يلي:
    • إذا لم يكن الجدول "A" موجودًا ، فقم بإنشاء جدول "A" وأدخل صفوفًا فيه.
  • في وقت لاحق في هذا البرنامج النصي ، أقوم بإنشاء مخطط عرض مفهرسة على هذا الجدول.
  • أحيانا, ، عندما أقوم بإعادة تشغيل البرنامج النصي ، بعد إنشاء الجدول ، يقوم SQL Server Management Studio بتقييم رمز "إدراج صفوف" ، وهو محمي بواسطة رمز "إذا لم يكن هذا الجدول" ، ويحقق ما يلي خطأ:

    فشل MSG 1934 ، المستوى 16 ، الحالة 1 ، السطر 15 ، لأن خيارات المجموعة التالية لها إعدادات غير صحيحة: "concat_null_yields_null ، ansi_warnings ، ansi_padding ، arithabort '. تحقق من أن الخيارات المحددة صحيحة للاستخدام مع طرق العرض المفهرسة و/أو الفهارس على الأعمدة المحسوبة و/أو الفهارس المصفاة و/أو إعلامات الاستعلام و/أو طرق نوع بيانات XML و/أو عمليات الفهرس المكاني.

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

سؤالي:

هل يقوم برنامج التحويل البرمجي SSMS بتقييم الكل التعبيرات ، بغض النظر عما إذا كانت ستتم تنفيذها بالفعل؟

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

المحلول

نعم ، يقوم بتقييمهم جميعًا ، ألق نظرة على هذا

declare @i int
select @i =1

if @i = 1
begin
    declare @i2 int
    set @i2 = 5
end
else 
begin
    declare @i2 int
    set @i2 = 5
end

MSG 134 ، المستوى 15 ، الحالة 1 ، السطر 12 تم الإعلان عن الاسم المتغير "@i2". يجب أن تكون الأسماء المتغيرة فريدة من نوعها ضمن دفعة استعلام أو إجراء مخزّن.

مثال آخر مع Temp Tables هنا: ما هو دقة الاسم المؤجلة ولماذا تحتاج إلى الاهتمام؟

سيكون طريقك الوحيد للخروج هو لفه داخل SQL الديناميكي

نصائح أخرى

لاحظ أن معظم الإعدادات التي ذكرتها هي على مستوى الاتصال ، أي في حالة تعيينها/تغييرها ، فإنها تبقى سارية ما لم تغلق الاتصال أو تغيير قيمتها صراحة.

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

تحرير: ليس برنامج التحويل البرمجي SSMS هو الذي يقوم بتقييم SQL الذي تحاول تنفيذه - إنه SQL Server. ماذا تقصد بـ "التقييم"؟ هل هو "ينفذ"؟ عندما تقوم بتشغيل دفعة (وهو ما يتم تنفيذه بالفعل بواسطة خادم) ، يقوم SQL Server أولاً بتحليل النحوي ويلقي خطأ في حالة العثور على أي شيء النحوية خطأ ، لا يتم تنفيذ أي شيء في هذه الفترة الزمنية. في حالة بناء الجملة على ما يرام ، يبدأ الخادم في تنفيذ الدفع.

مرة أخرى ، يبدو أن الخطأ الذي تظهره مدة العرض - لذلك أعتقد أنك ستراقب بعناية الظروف وتتبع ما يحدث (أو توفير المزيد من التفاصيل حول "في بعض الأحيان").

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top