2010-08-26 5 views
10

Existe-t-il un outil pour convertir une requête SQL d'une base de données en une autre?Convertir une requête SQL pour une base de données différente

Pour SQLite

> CREATE TABLE ConstantValues( Id int 
> AUTOINCREMENT primary key , 
> VariableName varchar(50) , Values 
> varchar(150)) 

Pour SQL Server

> CREATE TABLE ConstantValues( Id 
> INTEGER identity(1,1) primary key , 
> VariableName varchar(50) , Values 
> varchar(150)) 

De même, il est différent pour Oracle et SQL Server. Aussi, dans la déclaration des contraintes de clé étrangère, s'il y a un outil pour que nous puissions obtenir SQL depuis n'importe quelle base de données vers n'importe quelle base de données, ce serait vraiment utile pour moi.

J'ai créé une fonction comme celui-ci, mais il ne semble pas être une bonne solution:

private string changeSQL(string sql) 
{ 
    switch (dbtype) 
    { 
     case dbType.SQLite: 
      sql = sql.Replace(" int ", " INTEGER "); 
      sql = sql.Replace(" identity(1,1) ", " AUTOINCREMENT "); 
      break; 
     case dbType.MsAscess: 
      sql = sql.Replace(" int ", " "); 
      sql = sql.Replace(" identity(1,1) ", ""); 
      sql = sql.Replace("AUTOINCREMENT", "AUTOINCREMENT"); 

      break; 
    } 
    return (sql); 
} 

De même pour SQLite, concaténation est effectuée à l'aide || alors que dans SQL Server, il est fait à l'aide +.

+1

juste passé en revue une application 3ème partie qui a été porté comme celui d'Oracle à MSSQL. Ils ont écrit du code pour implémenter SEQUENCES. Sauf dans des cas simples, le changement de SGBDR devrait également impliquer une refonte de la base de données. – Bill

+0

ne pas oublier de marquer la réponse comme acceptée si vous avez l'info que vous voulez .. –

Répondre

6

SwisSQL Console 5.0

Console offre une solution instantanée fournissant utilitaire de conversion SQL rapide et fiable requête qui accélère la migration. La console prend en charge la migration entre les bases de données Oracle, SQL Server, IBM DB2, MySQL, Sybase, PostgreSQL, Informix et Netezza. Ce logiciel a également des fonctionnalités pour tester les SQLs convertis dans les bases de données cibles.

+0

Je pense que c'est le seul outil! mais pourquoi est-ce que de tels outils auraient dû être développés par beaucoup de gens, je pense en développer un aussi! – Thunder

+0

@Thunder: SQL est un langage diaboliquement complexe et chaque fournisseur a un dialecte différent. Traduire d'un dialecte à un autre est très difficile à obtenir à 100%. C'est pourquoi il n'y a pas beaucoup d'outils qui font cela. Il n'y a même pas beaucoup d'outils qui fonctionnent vraiment bien avec plusieurs bases de données. –

2

Si je devais prendre en charge plusieurs systèmes de gestion de base de données, je le ferais à fond, avec un Data Access Layer pour chaque système. Cela nécessiterait une certaine quantité de travail, bien sûr, mais la modularité serait très bénéfique.

Une alternative avec laquelle je suis plutôt satisfait est DevExpress 'XPO. C'est un système de mapping relationnel objet qui supporte plusieurs bases de données. Vous concevez vos classes, définissez une chaîne de connexion appropriée, et le schéma de la base de données sera créé pour vous, et vous pouvez appliquer crud à vos classes facilement dans le code. Pour utiliser un système de base de données différent, changez seulement la chaîne de connexion!

Et non, je ne suis affilié à DevExpress que comme un client très satisfait.

http://www.devexpress.com/Products/NET/ORM/info.xml

4

d'abord, vous devez savoir et comprendre que chaque moteur SQL fonctionne avec une autre grammaire SQL. Malgré la norme SQL ANSI, aucun langage sur terre ne le respecte à 100%. De plus, tous les moteurs SQL, grands et connus, ajoutent leurs propres méthodes et éléments à la grammaire d'origine. Par conséquent, si vous souhaitez effectuer une conversion, la méthode la plus simple consiste à obtenir une couche SQL intermédiaire. Cela signifie, pour créer une grammaire SQL agnostique à partir des fonctionnalités très communes dans tous les moteurs SQL bien connus (il en résulterait quelque chose comme SQL Ansi plus toutes les fonctionnalités présentes dans chaque moteur, comme TOP). Une fois que vous avez ceci, vous devez faire la conversion à cette couche intermédiaire, et à partir de cette couche intermédiaire pour chaque variation SQL dont vous avez besoin. Je vous l'ai dit parce que j'avais besoin de cette chose exacte à mon travail, et c'était la seule façon de l'atteindre et de la rendre réutilisable. Avoir un outil vous donne le travail de convertir manuellement chaque requête, et de faire d'énormes SWITCH juste pour choisir la requête, ou pour avoir une classe héritée pour chaque moteur.

Je vous dis ce que j'ai fait: j'ai créé la BNF de ma grammaire SQL, puis j'ai créé un analyseur d'arborescence avec GoldParser pour C#.Ensuite, j'ai créé des règles individuelles pour chaque règle de la grammaire à convertir en chaque dialecte SQL. C'est un travail énorme et fastidieux, je sais. Mais ils m'ont payé pour le faire ...

Si vous n'avez pas le temps d'accomplir cela, vous pouvez utiliser ODBC. Chaque moteur SQL possède un connecteur ODBC et l'ODBC lui-même agit comme une couche abstraite intermédiaire. Mais, ce n'est pas aussi heureux que cela puisse paraître, car seules de simples requêtes maintiendront cette illusion ... des choses difficiles comme UNION, JOINs et la création de métadonnées ne seront pas les mêmes.

J'espère que cela a aidé,

bonne chance

+1

Il m'est arrivé de rencontrer la même situation pour convertir SQL query pour MSSQL, Oracle, MySQL, ACCESS pour notre produit logiciel. Pourriez-vous rendre votre code open source? Je pense que ce sera utile pour les débutants. Merci pour votre travail. –

1

Ce n'est pas un outil automatisé, mais la meilleure que j'ai trouvé pour comprendre les différences entre les différentes implémentations SQL est Cookbook SQL O'Reilley par Anthony Molinaro. http://oreilly.com/catalog/9780596009762/

Il montre comment résoudre de nombreux problèmes différents avec des requêtes SQL intelligentes, y compris la présentation par des solutions côté secondaires pour Oracle, SQL Server, DB2, MySQL et Postgres quand ils utilisent une syntaxe différente ou caractéristiques exclusives. Changer votre code pour travailler avec une base de données différente est beaucoup plus facile compte tenu des descriptions de la façon dont ils diffèrent systèmes. Molinaro explique également les requêtes de fenêtrage (ou ce que Oracle appelle les requêtes analytiques) qui valent le coup d'apprendre, car vous pouvez accomplir des tâches très efficacement avec une requête qui nécessitait auparavant du code client personnalisé qui gaspille de la bande passante et le temps.

-1

me donnent des informations sur le convertisseur de requête pour les bases de données diff

c'est votre artical « Convertir requête SQL pour une autre base de données »

Questions connexes