هل يقوم SQL Server Management Studio (أو SQL Server) بتقييم * جميع التعبيرات؟
-
26-09-2019 - |
سؤال
هذا هو التكوين الخاص بي:
- لديّ برنامج نصي دفعي قابل للتشغيل الذي أستخدمه لتحديث قاعدة البيانات الخاصة بي.
- داخل هذا البرنامج النصي الدُفعات ، لدي رمز يقول ما يلي:
- إذا لم يكن الجدول "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 أولاً بتحليل النحوي ويلقي خطأ في حالة العثور على أي شيء النحوية خطأ ، لا يتم تنفيذ أي شيء في هذه الفترة الزمنية. في حالة بناء الجملة على ما يرام ، يبدأ الخادم في تنفيذ الدفع.
مرة أخرى ، يبدو أن الخطأ الذي تظهره مدة العرض - لذلك أعتقد أنك ستراقب بعناية الظروف وتتبع ما يحدث (أو توفير المزيد من التفاصيل حول "في بعض الأحيان").