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 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, 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?
sql
sql-server
kidl33t
la source
la source
Réponses:
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 commeuserid.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:
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):
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.
la source
Appuyez simplement sur Ctrl+ Shift+ Ret voyez ...
Dans SQL Server Management Studio, Ctrl + Maj + R actualise le cache local.
la source
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.
la source
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.
la source
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.
la source
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.
la source
Dans mon cas, je redémarre Microsoft SQL Server Management Studio et cela fonctionne bien pour moi.
la source
Dans mon cas, j'essayais d'obtenir la valeur du mauvais ResultSet lors de l'interrogation de plusieurs instructions SQL.
la source
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.
la source
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.
la source
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:
la source
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