Carte du site
 Remerciements
 Netiquette
 Bugs
 Tables
 Requêtes
 Formulaires
 États (rapports)
 Modules
 APIs
 Chaînes
 Date/Time
 Général
 Ressources
 Téléchargeables

 Termes d'usage

Requêtes: Jet-MSDE: DELETE * FROM Table1; Incorrect syntax near '*'

Author(s)

--- Posted by Michel Walsh et John Viescas---

Jet-MSDE: DELETE * FROM Table1; Incorrect syntax near '*'

Le problème peut survenir lors de migrations utilisant  DELETE * FROM Table, et DISTINCTROW, depuis JET 4, vers MS SQL Server 7, ou MSDE.

Pour un utilisateur de Jet, l'énoncé produit par l'environnement de design des requêtes produit des énoncés d'effacement du genre:

DELETE * FROM Table1 WHERE ...

mais l'énoncé SQL, tel quel, sur MS SQL Server 7, ou MSDE, produit une erreur, même en l'absence de  WHERE:

Incorrect syntax near '*'

En fait, la syntaxe pour MS SQL Server, est: 

DELETE FROM Table1 WHERE ...

puisque vous effacez tout l'enregistrement, non seulement quelque champ.

Est-ce tout? Que se passe-t-il dans le cas où on possède une jointure (join), de quelle table efface-t-on les enregistrements, dans un cas comme:

DELETE FROM Table1 INNER JOIN Table2 ON ....

En fait, la syntaxe, en Jet 4, est:

DELETE DISTINCTROW Table1.* FROM Table1 INNER JOIN Table2 ON ....

mais le mot réservé DISTINCTROW n'est connu que dans JET. Pour traduire la même idée, sous MS SQL Server, on utilise également une syntaxe spéciale, qui n'est pas du SQL standard, soit la syntaxe "DELETE FROM FROM":

DELETE FROM Table1 FROM Table1 INNER JOIN Table2 ON ....

où on note qu'on a simplement remplacé  "DISTINCTROW Table1.*"   par  "FROM Table1"  et la conversion de Jet 4 vers MS SQL 7 est effectuée.

Si vous préférez demeurer avec une syntaxe strictement en accord avec le standard ANSI SQL:

DELETE FROM Table1 WHERE Table1.Key1 IN (SELECT Key1 FROM Table2) ...

[ et on n'oublie pas d'insérer Table1.* entre le DELETE et le FROM pour la version JET!]

Puisqu'on parle de DISTINCTROW, ce mot réservé est également impliqué, avec Jet 4, avec un UPDATE:

UPDATE DISTINCTROW Table1     
   INNER JOIN Table2     
   ON Table1.F1 = Table2.F1     
   SET Table1.F2 = 44;

Une traduction possible pour MS SQL Server, et MSDE, dans ce cas est donné par:

UPDATE Table1 
    SET Table1.F2=44 
    FROM  Table2 
    WHERE Table1.F1=Table2.F1

ce qui devrait vous faciliter une migration de Jet 4 vers MS SQL ou MSDE.

Q168438
ACC97: Changes with DISTINCTROW in Microsoft Access 97
Q163054
ACC97: Error Running Update Query in Converted Database
Transact-SQL Programming
O'Reilly, by Kline, Gould and Zanevsky

pp108-112

© 1998-2001, Dev Ashish, All rights reserved. Optimized for Microsoft Internet Explorer