web-dev-qa-db-fra.com

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

Je me suis retrouvé dans une impasse. J'ai une requête générée par un code C#. La requête fonctionne correctement dans Microsoft SQL Server Management Studio lorsqu'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, la même erreur se produit concernant une colonne non valide et une exception est levée. Toutes les requêtes faisant 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 telles que Select MAX(Incident_Being_Time_ts); échouent également lorsqu'elles sont exécutées dans le code car la colonne est manquante. 

Des idées?

87
kidl33t

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 au schéma par défaut du compte utilisé pour se connecter à SQL Server (quelque chose comme userid.PerfDiag).

Lorsque vous disposez d'une référence non qualifiée à un objet de schéma (tel qu'une table) - non qualifiée par nom de schéma - la référence d'objet doit être résolue. La résolution de nom se produit en recherchant dans la séquence suivante un objet du type approprié (table) portant le nom spécifié. Le nom résout 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.

En règle générale, on devrait 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 qui exécutent la procédure stockée ou la requête. Cela entraîne la recompilation de la requête/procédure stockée, un impact négatif sur les performances. Les recompilations entraînent 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 analyses doivent être effectuées pour résoudre la version probable de l'objet (celle appartenant à 'dbo'). C'est le cas habituel. Le nom ne résout le nom qu'une seule fois si l'utilisateur actuel possède un objet du nom et du type spécifiés.

[Edité pour plus de note]

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.

57
Nicholas Carey

Appuyez simplement sur Ctrl + Shift + R et voir ...

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

227
Mangesh

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.

7
Stagg

Je viens d'avoir exactement le même problème. J'ai renommé certaines colonnes avec alias 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, qui 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 vers cette nouvelle requête et de l'exécuter à nouveau. Cela semblait rafraîchir l'environnement correctement.

2
ApplePie

Si vous utilisez des variables portant le même nom que votre colonne, vous avez peut-être oublié le marqueur de variable '@'. Dans une instruction INSERT, il sera détecté sous forme de colonne.

2
Dévan Coetzee

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

1
Rexhi

J'ai finalement arrêté et redémarré Microsoft SQL Server Management Studio; et cela a résolu le problème pour moi. Mais parfois, il suffisait de commencer une nouvelle fenêtre de requête.

1
IAM_AL_X

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

Si votre code fonctionnait bien et que vous avez ajouté une colonne à l'une de vos tables et que l'erreur "Nom de colonne non valide" était détectée, et que les solutions ci-dessus ne fonctionnaient pas, essayez ceci: Commencez par exécuter uniquement la section de code permettant de créer celle modifiée table et ensuite exécuter le code entier.

0
LoMaPh

Y compris cette réponse car c’était le résultat le plus élevé 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 modifié pour correspondre à l'identifiant de l'objet .HasOne (), l'erreur a disparu. 

0
Daniel

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

0
Deepak Kataria