Erreur dans une clause TOP conditionnelle
Bonjour,
Afin de réaliser un INSERT conditionnel (qui en fait évite de faire préalablement une requête SELECT de vérification de l'existence de l'enregistrement puis la requête d'insert : l'utilisation du TOP permet de ne faire que la requête d'INSERT), j'utilise une clause TOP conditionnelle. Un exemple vaut 1000 explications.
Soit la table T1
Code:
CREATE TABLE T1 (C1 AS INT, C2 AS CHAR(1))
On la peuple d'une seule ligne
Code:
INSERT INTO T1 (C1, C2) VALUE (1, 'A')
Et voici la version de la requête d'insertion qui génère l'erreur
Code:
INSERT INTO T1 (C1, C2) SELECT TOP (CASE WHEN C1=1 THEN 0 ELSE 1 END) 1, 'A' FROM T1
Et l'erreur générée :
Msg*4115, Niveau*15, État*1, Ligne*1
La référence à la colonne "C1" n'est pas autorisée dans un argument pour une clause TOP, OFFSET ou FETCH. Seules les références aux colonnes dans une étendue externe ou des expressions autonomes et des sous-requêtes sont autorisées ici.
Contourner cette erreur est facile, puisque l'erreur précise qu'une sous-requête est autorisée :
Code:
INSERT INTO T1 (C1, C2) SELECT TOP (CASE WHEN EXIST (SELECT * FROM T1 WHERE C1=1) THEN 0 ELSE 1 END) 1, 'A' FROM T1
Mais je me pose la question de la raison pour laquelle la première syntaxe génère cette erreur, et pourquoi elle poserait un problème au moteur SQL ?
Si vous avez une idée, merci d'avance.