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 ?

Pourquoi SQL Server Management Studio contourne-t-il parfois la validation de la syntaxe dans les sous-requêtes ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-20 01:12:09274parcourir

Why Does SQL Server Management Studio Sometimes Bypass Syntax Validation in Subqueries?

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 Photohs_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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn