Question

Les vendeurs de SGBD

utiliser les fonctions de dialecte SQL pour différencier leurs produits, en même temps prétendre soutenir les normes SQL. « Nuff a dit à ce sujet.

Y at-il par exemple de SQL que vous avez un code qui ne peut pas être traduit à SQL: 2008 SQL standard

Pour être précis, je parle DML (une instruction de requête), pas DDL, la syntaxe de procédure stockée ou tout ce qui est pas une déclaration pure SQL.

Je parle aussi de questions que vous utiliseriez dans la production, et non pas pour des choses ad hoc.

Modifier 13 janvier

Merci pour toutes vos réponses: ils ont m'a transmis l'impression que beaucoup de SQL spécifiques SGBD est créé pour permettre contournements pour une mauvaise conception relationnelle. Ce qui me conduit à la conclusion que vous auriez probablement pas voulez pour les applications portuaires les plus existantes.

Était-ce utile?

La solution

différences typiques comprennent la sémantique subtilement differnt (par exemple poignées Oracle NULLs différemment des autres dialectes SQL dans certains cas), différents mécanismes de gestion des exceptions, les différents types et méthodes propriétaires pour faire des choses comme les opérations de chaîne, les opérations de date ou des requêtes hiérarchiques. Conseils de requête ont également tendance à avoir une syntaxe qui varie selon les plates-formes et différentes optimiseurs peuvent se confondre sur les différents types de constructions.

On peut utiliser la norme ANSI SQL pour la plupart à travers les systèmes de base de données et espérer obtenir des résultats raisonnables sur une base de données sans problèmes de réglage importants comme les index manquants. Cependant, toute application non triviale, il est susceptible d'être une exigence pour le code qui ne peut pas facilement être fait portably.

En règle générale, cette exigence sera assez localisée dans une base de code d'application - une poignée de requêtes où cela provoque un problème. Les rapports sont beaucoup plus susceptibles de jeter ce type de problème et de faire des requêtes de rapports génériques qui fonctionnent à travers les gestionnaires de bases de données est très peu susceptible de bien fonctionner. Certaines applications sont plus susceptibles de causer la douleur que d'autres.

Par conséquent, il est peu probable que le recours à des constructions SQL « portables » pour une application fonctionnera dans le cas général. Une meilleure stratégie consiste à utiliser des instructions génériques où ils travailleront et de sortir à une couche spécifique de base de données où cela ne fonctionne pas.

Un mécanisme de requête générique pourrait être d'utiliser ANSI SQL si possible; Une autre approche possible serait d'utiliser un O / R Mapper, qui peut prendre des pilotes pour différentes plates-formes de bases de données. Ce type de mécanisme devrait suffire pour la majorité des opérations de base de données, mais vous obligera à faire des travaux de plate-forme specifc où il est à court de vapeur.

Vous pourrez peut-être utiliser des procédures stockées comme une couche d'abstraction pour des opérations plus complexes et le code d'un ensemble de sprocs spécifiques de la plate-forme pour chaque plate-forme cible. Les sprocs pourraient être accessibles par quelque chose comme ADO.net.

Dans la pratique, les différences subtiles passant paramter et la gestion des exceptions peuvent causer des problèmes avec cette approche. Une meilleure approche est de produire un module qui enveloppe la les opérations de base de données spécifiques à la plate-forme avec une interface commune. Différents modules « pilotes » peuvent être échangés et en fonction de ce SGBD plate-forme que vous utilisez.

Autres conseils

Oracle a quelques ajouts, comme modèle ou hiérarchique requêtes très difficile, voire impossible, de traduire en pur SQL

Même lorsque SQL: 2008 peut faire quelque chose parfois la syntaxe est pas la même. Prenez la syntaxe de correspondance d'expressions rationnelles par exemple, SQL. 2008 utilise LIKE_REGEX vs le REGEXP de MySQL

Et oui, je suis d'accord, il est très ennuyeux.

Une partie du problème avec Oracle est qu'il est toujours basé sur SQL 1992 norme ANSI. SQL Server est sur la norme SQL 1999, donc quelques-unes des choses qui ressemblent à des « extensions » sont en fait des normes les plus récentes. (Je crois que la clause "OVER" est l'un de ceux-ci.)

Oracle est également beaucoup plus restrictive au sujet de placer les sous-requêtes dans SQL. SQL Server est beaucoup plus flexible et permissifs permettant presque partout les sous-requêtes.

SQL Server a une façon rationnelle pour sélectionner le "top" ligne d'un résultat: "SELECT TOP 1 DE CLIENTS ORDER BY SALES_TOTAL". Dans Oracle, cela devient "SELECT * FROM (SELECT CLIENTS PAR ORDRE SALES_TOTAL) OU ROW_NUMBER <= 1".

Et bien sûr, il y a toujours SELECT infâme Oracle (expression) DE DOUBLE.

Modifier pour ajouter:

Maintenant que je suis au travail et peut accéder à certains de mes exemples, voici un bon. Il est généré par LINQ to SQL, mais il est une question propre pour sélectionner les lignes 41 à 50 à partir d'une table, après le tri. Il utilise la clause "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]

commune ici sur le SO

Pour répondre exactement:

ISNULL peut facilement donner des résultats différents que COALESCE sur SQL Server en raison de la priorité de type de données, selon mon réponse / commentaires ici

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top