SQL Server signale "Nom de colonne non valide", mais la colonne est présente et la requête fonctionne via le studio de gestion

107

Je suis dans une impasse. J'ai une requête qui est générée par du C#code. La requête fonctionne correctement Microsoft SQL Server Management Studiolorsqu'elle est exécutée sur la même base de données.

Cependant, lorsque mon code tente d'exécuter la même requête, j'obtiens la même erreur concernant une colonne non valide et une exception est levée. Toutes les requêtes qui font référence à cette colonne échouent.

La colonne en question a été récemment ajoutée à la base de données. C'est une colonne de date appelée Incident_Begin_Time_ts.

Un exemple qui échoue est:

select * from PerfDiag 
where Incident_Begin_Time_ts > '2010-01-01 00:00:00';

D'autres requêtes comme Select MAX(Incident_Being_Time_ts);également échouent lorsqu'elles sont exécutées dans le code car il pense que la colonne est manquante.

Des idées?

kidl33t
la source
Est-ce un problème avec le cas peut-être? Peut-être que Management Studio ne se soucie pas du cas, tandis que d'autres moyens d'accéder à la base de données sont plus stricts.
Oliver
1
Êtes-vous sûr de traiter la même base de données dans votre code que celle de Management Studio?
rlb.usa
3
Êtes-vous sûr que le nom de colonne que vous avez créé en C # et le nom de colonne que vous essayez d'interroger sont exactement les mêmes? Dans votre question, vous écrivez deux fois «Incident _ Begin _ Time_ts» et une fois «Incident _ Being _ Time_ts».
Christian Specht
1
@Oliver: la sensibilité à la casse n'est pas par connexion. C'est comme une option de serveur de base de données / sql.
Nicholas Carey

Réponses:

65

Je soupçonne que vous avez deux tables avec le même nom. L'un appartient au schéma 'dbo' ( dbo.PerfDiag), et l'autre appartient au schéma par défaut du compte utilisé pour se connecter à SQL Server (quelque chose comme userid.PerfDiag).

Lorsque vous avez une référence non qualifiée à un objet de schéma (comme une table) - une non qualifiée par le nom de schéma - la référence d'objet doit être résolue. La résolution de noms se produit en recherchant dans la séquence suivante un objet du type approprié (table) avec le nom spécifié. Le nom correspond à la première correspondance:

  • Sous le schéma par défaut de l'utilisateur.
  • Sous le schéma «dbo».

La référence non qualifiée est liée à la première correspondance de la séquence ci-dessus.

Comme pratique générale recommandée, il convient de toujours qualifier les références aux objets de schéma, pour des raisons de performances:

  • Une référence non qualifiée peut invalider un plan d'exécution mis en cache pour la procédure stockée ou la requête, car le schéma auquel la référence était liée peut changer en fonction des informations d'identification exécutant la procédure stockée ou la requête. Cela entraîne une recompilation de la requête / procédure stockée, un impact sur les performances. Les recompilations provoquent la suppression des verrous de compilation, empêchant les autres d'accéder aux ressources nécessaires.

  • La résolution de nom ralentit l'exécution de la requête car deux sondes doivent être effectuées pour résoudre la version probable de l'objet (celle appartenant à «dbo»). C'est le cas habituel. Le seul moment où une seule sonde résoudra le nom, c'est si l'utilisateur actuel possède un objet du nom et du type spécifiés.

[Modifié pour en savoir plus]

Les autres possibilités sont (sans ordre particulier):

  • Vous n'êtes pas connecté à la base de données que vous pensez être.
  • Vous n'êtes pas connecté à l'instance SQL Server que vous pensez être.

Vérifiez vos chaînes de connexion et assurez-vous qu'elles spécifient explicitement le nom de l'instance SQL Server et le nom de la base de données.

Nicolas Carey
la source
4
+1 J'utilise le profileur sql pour suivre ces types de problèmes. Chaque fois que vous traitez avec SQL dynamique à partir d'autres applications, capturez la requête avec une trace, copiez-la et collez-la dans une nouvelle fenêtre de requête, cliquez sur Exécuter pour découvrir ce qui ne va pas. Cela validera également que vous vous connectez à la bonne instance et à la base de données comme suggéré ci-dessus.
brian
2
... légèrement hors sujet mais si vous utilisez le profileur pour reproduire les problèmes de performances, n'oubliez pas d'inclure toutes les options définies , en particulier ARITHABORT pour vraiment dupliquer la requête (et son plan mis en cache)
Nick.McDermaid
Essayez d'abord avec Ctrl + Shift + R, pour recharger le cache. Dans le pire des cas, vous ne perdez que quelques secondes.
radbyx
267

Appuyez simplement sur Ctrl+ Shift+ Ret voyez ...

Dans SQL Server Management Studio, Ctrl + Maj + R actualise le cache local.

Mangesh
la source
Pourquoi pensez-vous que cela serait utile?
Amiable le
7
Dans SQL Server Management Studio, Ctrl + Maj + R actualise le cache Intellisense. Cela a empêché Management Studio de se plaindre du fait que les colonnes que j'avais ajoutées ne sont pas valides, mais je pense que c'était un hareng (j'ai toujours un problème, comme l'affiche d'origine, lors de l'accès à ces nouvelles colonnes à partir du code).
Giles
2
Il semble que chaque fois que je Add-Migration, puis Update Database, je dois le faire. Sinon, j'obtiens que c'est un nom de colonne invalide dans MS SQL Server. Travaux! Merci beaucoup.
BriOnH
1
Il semble que vous deviez le faire chaque fois que vous créez une table ou quoi que ce soit de ce genre.
Sonny Childs
1
Ce ci-dessus est normalement ma solution de choix lorsque des choses étranges se produisent. Dans ce cas, cependant, cela n'a pas résolu le problème. Le redémarrage de SQL Studio a cependant fait l'affaire.
Dan Mehlqvist
9

Si vous exécutez ceci dans une transaction et une instruction SQL avant que cela supprime / modifie la table, vous pouvez également obtenir ce message.

Stagg
la source
1
+1. J'ai modifié une table en ajoutant une nouvelle colonne et j'obtenais cette erreur dans la déclaration suivante référençant la nouvelle colonne. J'ai surmonté cela en exécutant les instructions jusqu'à la modification de la table d'un coup, puis le reste d'une autre. Pas la meilleure des solutions, mais m'a débloqué. :)
Prasad Korhale
3

J'ai finalement arrêté et redémarré Microsoft SQL Server Management Studio; et cela l'a arrangé pour moi. Mais à d'autres moments, il suffisait de démarrer une nouvelle fenêtre de requête.

IAM_AL_X
la source
2

Si vous utilisez des variables portant le même nom que votre colonne, il se peut que vous ayez oublié le marqueur de variable «@». Dans une instruction INSERT, il sera détecté comme une colonne.

Dévan Coetzee
la source
2

J'ai juste eu exactement le même problème. J'ai renommé certaines colonnes aliasées dans une table temporaire qui est ensuite utilisée par une autre partie du même code. Pour une raison quelconque, cela n'a pas été capturé par SQL Server Management Studio et il s'est plaint de noms de colonnes non valides.

Ce que j'ai simplement fait est de créer une nouvelle requête, de copier-coller le code SQL de l'ancienne requête dans cette nouvelle requête et de l'exécuter à nouveau. Cela a semblé rafraîchir correctement l'environnement.

Tarte aux pommes
la source
1

Dans mon cas, je redémarre Microsoft SQL Server Management Studio et cela fonctionne bien pour moi.

Rexhi
la source
0

Dans mon cas, j'essayais d'obtenir la valeur du mauvais ResultSet lors de l'interrogation de plusieurs instructions SQL.

Deepak Kataria
la source
0

Dans mon cas, il semble que le problème soit un problème de mise en cache étrange. Les solutions ci-dessus n'ont pas fonctionné.

Si votre code fonctionnait correctement et que vous avez ajouté une colonne à l'une de vos tables et que cela donne l'erreur `` nom de colonne invalide '', et que les solutions ci-dessus ne fonctionnent pas, essayez ceci: Commencez par exécuter uniquement la section de code pour créer celle modifiée table, puis exécutez tout le code.

LoMaPh
la source
0

Y compris cette réponse, car il s'agissait du meilleur résultat pour "nom de colonne non valide sql" sur Google et je n'ai pas vu cette réponse ici. Dans mon cas, j'obtenais un nom de colonne non valide, Id1, car j'avais utilisé le mauvais identifiant dans mon instruction .HasForeignKey dans mon code Entity Framework C #. Une fois que je l'ai changé pour correspondre à l'id de l'objet .HasOne (), l'erreur a disparu.

Daniel
la source
0

J'ai eu cette erreur lors de l'exécution d'une fonction scalaire en utilisant une valeur de table, mais l'instruction Select dans ma clause RETURN de fonction scalaire manquait la partie "FROM table". : facepalms:

cdabel
la source
0

Cela se produit également lorsque vous oubliez de modifier la ConnectionString et demandez à une table qui n'a aucune idée des modifications que vous apportez localement.

Иво Недев
la source