Maison >base de données >tutoriel mysql >Pourquoi SQL Server Management Studio contourne-t-il parfois la validation de la syntaxe dans les sous-requêtes ?
SQL Server Management Studio : Comportement inattendu des sous-requêtes
SQL Server Management Studio (SSMS) présente parfois un comportement inattendu lors du traitement de requêtes contenant des sous-requêtes faisant référence à des champs non valides. Bien que SSMS effectue généralement une validation de syntaxe, il peut étonnamment ignorer ces erreurs dans des circonstances spécifiques, semant la confusion chez les développeurs.
Considérez cet exemple :
<code class="language-sql">delete from Photo where hs_id in (select hs_id from HotelSupplier where id = 142)</code>
Cette requête vise à supprimer des entrées de la table Photo
en fonction des valeurs hs_id
trouvées dans une sous-requête sélectionnant parmi HotelSupplier
. Cependant, HotelSupplier
n'a pas de champ hs_id
; il utilise hs_key
à la place.
Curieusement, cette requête s'exécute souvent sans erreur dans SSMS, malgré l'échec de la sous-requête elle-même lorsqu'elle est exécutée indépendamment :
<code class="language-sql">select hs_id from HotelSupplier where id = 142</code>
L'explication
Le comportement de SSMS provient de sa gestion des références de colonnes non qualifiées. Il interprète la référence hs_id
comme appartenant à la requête externe (Photo
), et non à la sous-requête. Cela suit la règle de résolution des noms de colonnes non qualifiés de la portée la plus externe vers l'intérieur.
Étant donné que la sous-requête ne sélectionne explicitement aucune colonne, SSMS réécrit effectivement la requête comme :
<code class="language-sql">delete from Photo where Photo.hs_id in (select * from HotelSupplier where id = 142)</code>
Si la sous-requête renvoie des lignes (comme c'est probablement le cas ici), cela supprime toutes les lignes de Photo
où hs_id
n'est pas NULL. Un jeu de résultats non vide de la sous-requête entraîne l'évaluation de la clause IN
à true pour les valeurs non NULL.
Clé à retenir
Ce comportement apparemment contre-intuitif souligne l'importance d'utiliser des noms de colonnes complets (par exemple, HotelSupplier.hs_key
) dans vos requêtes SQL. Cette pratique évite toute ambiguïté et garantit une exécution prévisible des requêtes, évitant ainsi les suppressions de données inattendues ou d'autres conséquences involontaires.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!