SQL Server报告“无效的列名”,但是该列存在并且该查询通过Management Studio工作


107

我陷入了僵局。我有一些C#代码生成的查询。Microsoft SQL Server Management Studio在同一数据库上运行时,查询工作正常。

但是,当我的代码尝试运行相同的查询时,我收到有关无效列的相同错误,并引发了异常。引用此列的所有查询均失败。

该列最近已添加到数据库中。这是一个名为的日期列Incident_Begin_Time_ts

失败的示例是:

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

其他查询Select MAX(Incident_Being_Time_ts);在代码中运行时也会失败,因为它认为缺少该列。

有任何想法吗?


案件可能有问题吗?也许Management Studio不在乎大小写,而其他访问数据库的方式则更为严格。
奥利弗(Oliver)

1
您确定要在代码中处理与Management Studio中相同的数据库吗?
rlb.usa 2011年

3
您确定在C#中创建的列名称与尝试查询的列名称完全相同吗?在您的问题中,您要写两次“事件_ 开始 _ Time_ts”和一次“事件_ 正在 _ Time_ts”。
Christian Specht

1
@Oliver:不区分大小写。它是作为数据库/ sql服务器选项。
尼古拉斯·凯里

Answers:


65

我怀疑您有两个具有相同名称的表。一个由架构'dbo'(dbo.PerfDiag)拥有,另一个由用于连接到SQL Server的帐户的默认架构拥有(类似userid.PerfDiag)。

如果您对架构对象(例如表)有不合格的引用(即不由架构名称限定的引用),则必须解析对象引用。通过按以下顺序搜索具有指定名称的适当类型(表)的对象,可以进行名称解析。名称解析为第一个匹配项:

  • 在用户的默认架构下。
  • 在模式“ dbo”下。

不合格的引用将绑定到上述序列中的第一个匹配项。

作为一种普遍建议的做法,出于性能原因,应始终限定对架构对象的引用:

  • 不合格的引用可能会使该存储过程或查询的缓存执行计划无效,因为引用所绑定的架构可能会根据执行该存储过程或查询的凭据而改变。这将导致重新编译查询/存储过程,从而影响性能。重新编译会导致编译锁被取出,从而阻止其他人访问所需的资源。

  • 名称解析会减慢查询的执行速度,因为必须进行两次探测才能解析该对象的可能版本(“ dbo”拥有的版本)。这是通常的情况。如果当前用户拥有指定名称和类型的对象,则单个探测器唯一会解析该名称的方法。

[编辑以作进一步说明]

其他可能性是(无特定顺序):

  • 您未连接到您认为的数据库。
  • 您未连接到您认为的SQL Server实例。

仔细检查您的连接字符串,并确保它们明确指定SQL Server实例名称和数据库名称。


4
+1我使用sql profiler来跟踪这些类型的问题。每当您从其他应用程序处理动态sql时,都可以使用跟踪捕获查询,将其复制并粘贴到新的查询窗口中,然后单击“执行”以找出问题所在。这还将验证您是否如上所述连接到正确的实例和数据库。
brian

2
...稍微偏离主题,但是如果您使用探查器重现性能问题,请记住包括所有设置的选项,尤其是ARITHABORT以真正复制查询(及其缓存的计划)
Nick.McDermaid

首先尝试使用Ctrl + Shift + R重新加载缓存。最坏的情况下,您只会浪费几秒钟。
radbyx

267

只需按Ctrl+ Shift+即可R看到...

在SQL Server Management Studio中,按Ctrl + Shift + R刷新本地缓存。


您为什么认为这样做会有所帮助?
2014年

7
在SQL Server Management Studio中,按Ctrl + Shift + R刷新Intellisense缓存。这确实阻止了Management Studio抱怨我添加的列无效,但是我认为那是一个麻烦(我从代码访问这些新列时仍然遇到问题,就像原始海报一样)。
吉尔斯

2
似乎每次我添加迁移,然后更新数据库时,我都必须这样做。否则,我得到它是MS SQL Server中的无效列名。作品!非常感谢。
BriOnH

1
看起来您每次创建表或类似的内容时都可能必须执行此操作。
Sonny Childs

1
当发生奇怪的事情时,以上通常是我的解决方法。但是,在这种情况下,它并不能解决问题。重新启动SQL Studio可以解决问题。
Dan Mehlqvist,

9

如果在删除/更改表之前在事务和SQL语句中运行此消息,则也可以获得此消息。


1
+1。我通过添加新列更改了表,并且在引用新列的下一条语句中遇到此错误。我通过执行语句直到一次更改表,然后又一次执行其余语句来克服了这一问题。不是最好的解决方案,但让我畅通无阻。:)
Prasad Korhale '19

3

我最终关闭并重新启动了Microsoft SQL Server Management Studio;这为我解决了。但是在其他时候,仅启动一个新的查询窗口就足够了。



2

只是有完全相同的问题。我在临时表中重命名了一些别名列,该表又被同一代码的另一部分使用。由于某种原因,SQL Server Management Studio并未捕获到该错误,并且它抱怨列名无效。

我所做的只是创建一个新查询,将SQL代码从旧查询复制粘贴到此新查询,然后再次运行。这似乎可以正确刷新环境。


1

就我而言,我重新启动Microsoft SQL Sever Management Studio,这对我来说很好。



0

就我而言,这似乎是一个奇怪的缓存问题。上面的解决方案不起作用。

如果您的代码运行正常,并且在其中一个表中添加了一个列,并且给出了“无效的列名”错误,并且上述解决方案不起作用,请尝试以下操作:首先仅运行用于创建修改后的代码部分表,然后运行整个代码。


0

包含此答案,因为这是google上“无效列名sql”的最高结果,我在这里没有看到此答案。就我而言,我获得了无效的列名Id1,因为在Entity Framework C#代码的.HasForeignKey语句中使用了错误的ID。一旦更改它以匹配.HasOne()对象的ID,该错误就消失了。


0

使用表值运行标量函数时出现此错误,但是标量函数RETURN子句中的Select语句缺少“ FROM表”部分。:facepalms:


0

当您忘记更改ConnectionString并询问一个对本地所做的更改一无所知的表时,也会发生这种情况。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.