SQL Server reports 'Invalid column name', but the column is present and the query works through management studio

I've hit a bit of an impasse. I have a query that is generated by some C# code. The query works fine in Microsoft SQL Server Management Studio when run against the same database.

However when my code tries to run the same query I get the same error about an invalid column and an exception is thrown. All queries that reference this column are failing.

The column in question was recently added to the database. It is a date column called Incident_Begin_Time_ts .

An example that fails is:

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

Other queries like Select MAX(Incident_Being_Time_ts); also fail when run in code because it thinks the column is missing.

Any ideas?

417112 次浏览

我怀疑你有两张同名的桌子。一个属于模式‘ dbo’(dbo.PerfDiag) ,另一个属于用于连接到 SQL Server 的帐户的默认模式(类似于 userid.PerfDiag)。

当您有一个对模式对象(如表)的不限定引用时,必须解析对象引用。名称解析通过按以下顺序搜索具有指定名称的适当类型(表)的对象来实现。名称解析为第一个匹配项:

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

The unqualified reference is bound to the first match in the above sequence.

一般推荐的做法是,出于性能原因,一直都是应该限定对模式对象的引用:

  • An unqualified reference may invalidate a cached execution plan for the stored procedure or query, since the schema to which the reference was bound may change depending on the credentials executing the stored procedure or query. This results in recompilation of the query/stored procedure, a performance hit. Recompilations cause compile locks to be taken out, blocking others from accessing the needed resource(s).

  • 名称解析减慢了查询的执行,因为必须进行两个探测来解析对象的可能版本(属于“ dbo”)。这是常见的情况。只有当当前用户拥有指定名称和类型的对象时,单个探测才会解析该名称。

[编辑进一步注释]

其他的可能性是(没有特定的顺序) :

  • 您没有连接到您认为已连接的数据库。
  • 您没有连接到您认为已连接的 SQLServer 实例。

仔细检查连接字符串,并确保它们显式指定 SQLServer 实例名和数据库名。

如果您在事务和 SQL 语句中运行这个命令,那么在这个命令删除/更改表之前,您也可以得到这个消息。

只要按 Ctrl + Shift + R就可以看到..。

在 SQLServerManagementStudio 中,Ctrl + Shift + R 刷新本地缓存。

如果您使用与列同名的变量,那么可能是您忘记了“@”变量标记。在 INSERT 语句中,它将被检测为列。

只是遇到了一模一样的问题。我在一个临时表中重命名了一些别名列,这些列将由同一代码的另一部分进一步使用。由于某种原因,SQLServerManagementStudio 没有捕捉到这一点,并且抱怨列名无效。

What I simply did is create a new query, copy paste the SQL code from the old query to this new query and run it again. This seemed to refresh the environment correctly.

在我的例子中,当查询多个 SQL 语句时,我试图从错误的 ResultSet 中获取值。

我最终关闭并重新启动了 Microsoft SQL Server 管理工作室,这为我解决了问题。但在其他时候,仅仅启动一个新的查询窗口就足够了。

在我的例子中,问题似乎是一个奇怪的缓存问题。上面的解决方案不起作用。

如果你的代码运行良好,你在一个表中添加了一个列,然后出现“无效的列名”错误,并且上面的解决方案不起作用,试试这个: 首先只运行用于创建修改后的表的代码段,然后运行整个代码。

包括这个答案,因为这是谷歌上“无效列名 sql”的最高结果,我在这里没有看到这个答案。在我的例子中,我得到的是无效的列名 Id1,因为我在。在我的实体框架 C # 代码中的 HasForeignKey 语句。一旦我改变它来匹配。HasOne ()对象的 id,错误消失了。

在我的例子中,我重新启动了 MicrosoftSQLServerManagementStudio,这对我来说很有用。

在使用表值运行标量函数时,我得到了这个错误,但是标量函数 RETURN 子句中的 Select 语句缺少“ FROM table”部分。翻译: facepalms:

当您忘记更改 ConnectionString 并询问一个不知道您正在本地进行的更改的表时,也会发生这种情况。

我在使用 View 时遇到了这个问题,但是完全相同的 SQL 代码可以作为查询很好地工作。事实上,SSMS 实际上抛出了一对夫妇的其他问题的视图,它没有与查询。我尝试了刷新,关闭到服务器的连接,然后重新进入,并重命名列——没有任何效果。相反,我将查询创建为一个存储过程,并将 Excel 连接到该存储过程而不是 View,这样就解决了问题。