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.
Références: