Frage

DBMS Anbieter verwenden SQL-Dialekt Funktionen, ihr Produkt zu unterscheiden, die gleichzeitig behauptet, SQL-Standards zu unterstützen. ‚Nuff sagte zu diesem Thema.

Gibt es ein Beispiel für SQL Sie haben codieren, die nicht in SQL übersetzt werden kann: 2008 Standard-SQL

Um genau zu sein, ich spreche von DML (eine Abfrage-Anweisung), NICHT DDL, gespeicherte Prozedur Syntax oder etwas, das nicht eine reine SQL-Anweisung ist.

Ich rede auch über Fragen, die Sie in der Produktion verwenden würden, nicht für Ad-hoc-Sachen.

Edit 13. Januar

Vielen Dank für alle Ihre Antworten: sie mir einen Eindruck vermittelt haben, dass eine Menge der DBMS-spezifische SQL erstellt wird Umgehungen für schlechtes relationales Design zu ermöglichen. Das führt mich zu dem Schluss, würden Sie wahrscheinlich nicht wollen in den Hafen die meisten bestehenden Anwendungen.

War es hilfreich?

Lösung

Typische Unterschiede sind subtil Differnt Semantik (zB Oracle NULLs unterschiedlich von anderen SQL-Dialekten in einigen Fällen behandelt), verschiedene Ausnahmebehandlungsmechanismen, verschiedene Typen und proprietäre Methoden für Dinge wie String-Operationen, Datum Operationen oder hierarchische Abfragen zu tun. Abfragehinweise sind in der Regel auch Syntax haben, die über Plattformen hinweg variiert und verschiedene Optimierer kann verwirrt über die verschiedenen Arten von Konstrukten.

Man kann verwenden ANSI SQL zum größten Teil über Datenbanksysteme und erwarten keine signifikanten Tuning Probleme wie fehlende Indizes vernünftige Ergebnisse in einer Datenbank zu erhalten. Doch auf jeder nicht-triviale Anwendung gibt es wahrscheinlich einige Anforderung für Code sein, die nicht leicht portabel gemacht werden kann.

Normalerweise wird diese Anforderung recht innerhalb einer Anwendung Code-Basis lokalisiert - eine Handvoll Anfragen, wo dies ein Problem verursacht. Die Berichterstattung ist viel wahrscheinlicher, diese Art von Problem zu werfen und generische Reporting-Abfragen zu tun, die über mehrere Datenbankmanager arbeiten, ist sehr unwahrscheinlich, gut zu funktionieren. Einige Anwendungen sind eher verursachen Trauer als andere.

Es ist daher unwahrscheinlich, dass für eine Anwendung auf ‚tragbaren‘ SQL-Konstrukte unter Berufung wird im allgemeinen Fall arbeiten. Eine bessere Strategie ist generische Aussagen zu verwenden, wo sie arbeiten werden und brechen zu einer Datenbank spezifischer Schicht, wenn dies nicht funktioniert.

Ein generischer Abfrage-Mechanismus könnte ANSI SQL zu verwenden, wo möglich; Ein anderer möglicher Ansatz wäre, eine O / R-Mapper zu verwenden, die Treiber für verschiedene Datenbank-Plattformen nutzen. Diese Art von Mechanismus für die Mehrzahl der Datenbankoperationen ausreichen sollte, aber benötigen Sie eine Plattform-specifc Arbeit zu tun, wo es aus Dampf ausgeführt wird.

Sie können hier für komplexere Operationen und Code eine Reihe von plattformspezifischen sprocs für jede Zielplattform gespeicherten Prozeduren als Abstraktionsschicht verwenden. Die sprocs durch so etwas wie ADO.net zugegriffen werden kann.

In der Praxis subtile Unterschiede in Paramter Passspiel und die Ausnahmebehandlung können Probleme mit diesem Ansatz führen. Ein besserer Ansatz ist es, ein Modul zu erzeugen, das die Wraps plattformspezifische Datenbankoperationen mit einer gemeinsamen Schnittstelle. Verschiedene ‚Fahrer‘ Module können in und ausgelagert werden, je nachdem, welche DBMS-Plattform Sie verwenden.

Andere Tipps

Oracle hat einige Ergänzungen, wie Modell oder hierarchische Abfragen, die sehr schwierig, wenn nicht unmöglich, zu übersetzen, in reine SQL

Auch wenn SQL: 2008 etwas tun kann manchmal die Syntax ist nicht das gleiche. Nehmen Sie die REGEXP passende Syntax zum Beispiel SQL: 2008. LIKE_REGEX vs MySQL REGEXP verwendet

Und ja, ich stimme zu, es ist sehr ärgerlich.

Ein Teil des Problems mit Oracle ist, dass es nach wie vor auf dem SQL 1992 ANSI-Standard basiert. SQL Server ist auf SQL 1999 Standard, so dass einige der Dinge, die wie „Erweiterungen“ sind in der Tat neuere Standards aussehen. (Ich glaube, dass die „OVER“ Klausel eine davon ist.)

Oracle ist auch weit restriktivere über Subqueries in SQL platzieren. SQL Server ist wesentlich flexibler und permissive über Subqueries fast überall erlaubt.

SQL Server hat eine rationale Art und Weise die "top" Zeile eines Ergebnisses zu wählen: "TOP 1 VON KUNDEN ORDER BY SALES_TOTAL SELECT". In Oracle, wird diese "SELECT * FROM (CUSTOMERS ORDER BY SALES_TOTAL SELECT) WHERE ROW_NUMBER <= 1".

Und natürlich gibt es immer Oracle berüchtigte SELECT (Ausdruck) FROM DUAL.

Bearbeiten hinzuzufügen:

Nun, da ich bei der Arbeit bin und einige meiner Beispiele zugreifen kann, hier ist ein guter. Dies wird durch die LINQ-to-SQL erzeugt, aber es ist eine saubere Abfrage Zeilen auszuwählen, 41 bis 50 aus einer Tabelle nach dem Sortieren. Es nutzt die "OVER" Klausel:

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]

Gemeinsame hier auf SO

Zur Beantwortung genau:

ISNULL kann leicht unterschiedliche Ergebnisse als COALESCE auf SQL Server geben, weil der Datentyp Vorrang, wie pro meine Antwort / Kommentare hier

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top