سؤال

يستخدم بائعي DBMS ميزات لهجة SQL لتمييز منتجاتهم، في نفس الوقت الذي يدعي لدعم معايير SQL. وقال هيف في هذا.

هل هناك أي مثال على SQL قمت بترميزه الذي لا يمكن ترجمته إلى SQL: 2008 قياسي SQL؟

لتكون محددة، أنا أتحدث عن DML (عبارة استعلام)، وليس بناء جملة إجراءات DDL أو مخزنة أو أي شيء غير عبارة SQL نقية.

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

تحرير 13 يناير

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

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

المحلول

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

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

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

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

يمكن أن تكون آلية الاستعلام العامة هي استخدام ANSI SQL حيثما أمكن؛ سيكون نهج آخر محتمل هو استخدام Mapper O / R، والتي يمكن أن تأخذ برامج التشغيل لمختلف منصات البيانات المختلفة. يجب أن يكفي هذا النوع من الآلية بالنسبة لغالبية عمليات قاعدة البيانات ولكنه سيتطلب منك القيام ببعض الأعمال المنصوصية - Specifc حيث ينفد من البخار.

قد تتمكن من استخدام الإجراءات المخزنة كطبقة تجريدية لمزيد من العمليات المعقدة ورمز مجموعة من أنواع الأسطوانة المحددة لكل منصة مستهدفة. يمكن الوصول إلى التبريد من خلال شيء مثل ADO.NET.

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

نصائح أخرى

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

حتى عندما يكون SQL: 2008 القيام بشيء ما في بعض الأحيان، فإن بناء الجملة ليس هو نفسه. خذ بناء جملة Regexp المطابقة على سبيل المثال، SQL: 2008 LIKE_REGEX vs mysql's REGEXP.

ونعم، وأنا أوافق، إنه مزعج للغاية.

جزء من المشكلة مع Oracle هو أنه لا يزال يعتمد على معيار SQL 1992 ANSI. SQL Server موجود في معيار SQL 1999، لذلك بعض الأشياء التي تبدو وكأنها "ملحقات" هي في الواقع معايير أحدث. (أعتقد أن بند "انتهى" هو أحد هذه.)

Oracle هي أيضا تقييد أكثر بكثير حول وضع السطاجين في SQL. SQL Server أكثر مرونة وتسهلا حول السماح للناشئ التلقائية في أي مكان تقريبا.

يحتوي SQL Server على طريقة عقلانية لتحديد صف "أعلى" من النتيجة: "حدد أعلى 1 من طلب العملاء حسب Sales_Total". في Oracle، يصبح هذا "اختيار * من (حدد طلب العملاء عن طريق Sales_Total) حيث Row_Number <= 1".

وبالطبع هناك دائما اختيار Oracle السمعة (التعبير) من المزدوج.

تحرير لإضافة:

الآن أنني في العمل ويمكن أن الوصول إلى بعض أمثلةي، إليك واحدة جيدة. يتم إنشاء هذا بواسطة LinQ-To-SQL، ولكنه استعلام نظيف لتحديد الصفوف من 41 إلى 50 من جدول، بعد الفرز. يستخدم بند "Over":

SELECT [t1].[CustomerID], [t1].[CompanyName], [t1].[ContactName], [t1].[ContactTitle], [t1].[Address], [t1].[City], [t1].[Region], [t1].[PostalCode], [t1].[Country], [t1].[Phone], [t1].[Fax]
    FROM (
        SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ContactName]) AS [ROW_NUMBER], [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[ContactTitle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Country], [t0].[Phone], [t0].[Fax]
        FROM [dbo].[Customers] AS [t0]
        ) AS [t1]
    WHERE [t1].[ROW_NUMBER] BETWEEN 40 + 1 AND 40 + 10
    ORDER BY [t1].[ROW_NUMBER]

مشترك هنا على ذلك

للإجابة بالضبط:

ISNULLL يمكن بسهولة إعطاء نتائج مختلفة مثل coalesce على SQL Server بسبب الأسبقية نوع البيانات، حسب الإجابة / التعليقات هنا

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