135 votes

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

Je suis dans une impasse. J'ai une requête qui est générée par des C# code. La requête fonctionne correctement dans Microsoft SQL Server Management Studio lorsqu'ils sont exécutés 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 à propos d'une colonne invalide 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. Il s'agit d'une colonne de date appelée Incident_Begin_Time_ts .

Un exemple qui échoue est le suivant :

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'ils sont exécutés dans le code parce qu'ils pensent que la colonne est manquante.

Des idées ?

351voto

Mangesh Points 2939

Il suffit d'appuyer sur Ctrl + Shift + R et voir...

Dans SQL Server Management Studio, Ctrl+Shift+R rafraîchit le cache local.

77voto

Nicholas Carey Points 24614

Je soupçonne que vous avez deux tables portant le même nom. L'une 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 (tel qu'une table) - une référence non qualifiée par le nom du schéma - la référence à l'objet doit être résolue. La résolution du nom s'effectue en recherchant, dans la séquence suivante, un objet du type approprié (table) avec le nom spécifié. Le nom est résolu en fonction de 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 dans la séquence ci-dessus.

En règle générale, il est recommandé de siempre qualifier les références aux objets du schéma, pour des raisons de performance :

  • 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, étant donné que 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. Il en résulte une recompilation de la requête ou de la procédure stockée, ce qui nuit aux performances. Les recompilations entraînent la levée des verrous de compilation, ce qui empêche d'autres personnes d'accéder à la (aux) ressource(s) nécessaire(s).

  • La résolution de nom ralentit l'exécution de la requête, car il faut effectuer deux recherches pour trouver la version probable de l'objet (celle qui appartient à "dbo"). C'est le cas habituel. La seule fois où une seule sonde permet de résoudre le nom est lorsque l'utilisateur actuel possède un objet du nom et du type spécifiés.

[Modifié pour plus de précision]

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 du serveur SQL que vous pensez être.

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

16voto

Rexhi Points 111

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

12voto

Stagg Points 387

Si vous exécutez cette opération à l'intérieur d'une transaction et qu'une instruction SQL précédant cette opération supprime/modifie la table, vous pouvez également obtenir ce message.

5voto

IAM_AL_X Points 371

J'ai fini par arrêter et redémarrer Microsoft SQL Server Management Studio, ce qui m'a permis de résoudre le problème. Mais à d'autres moments, il suffisait de lancer une nouvelle fenêtre de requête.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X