SQL Server报告“无效的列名称”,但该列存在且查询通过管理研究工作

我遇到了一些僵局。 我有一个由一些Incident_Begin_Time_ts代码生成的查询。 在针对同一数据库运行时,查询在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);)在代码中运行时也会失败,因为它认为列缺失。

有任何想法吗?

kidl33t asked 2019-08-11T07:08:51Z
9个解决方案
219 votes

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

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

Mangesh answered 2019-08-11T07:11:14Z
59 votes

我怀疑你有两个同名的表。 一个由架构所拥有&#d;' (dbo.PerfDiag),另一个由用于连接到SQL Server的帐户的默认架构(类似于userid.PerfDiag)所有。

如果对模式对象(例如表)具有非限定引用(未通过模式名称限定),则必须解析对象引用。 通过按以下顺序搜索具有指定名称的相应类型(表)的对象,可以进行名称解析。 该名称解析为第一场比赛:

  • 在用户的默认架构下。
  • 根据架构' dbo'。

非限定引用与上述序列中的第一个匹配绑定。

作为一般推荐的做法,出于性能原因,应始终限定对架构对象的引用:

  • 非限定引用可能使存储过程或查询的高速缓存执行计划无效,因为绑定引用的模式可能会根据执行存储过程或查询的凭据而更改。 这导致重新编译查询/存储过程,性能损失。 重新编译会导致编译锁被取出,阻止其他人访问所需的资源。

  • 名称解析会降低查询执行速度,因为必须进行两次探测以解析对象的可能版本(由' dbo'所拥有)。 这是通常的情况。 单个探测器解析名称的唯一时间是当前用户是否拥有指定名称和类型的对象。

[编辑进一步说明]

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

  • 您没有连接到您认为自己的数据库。
  • 您没有连接到您认为自己的SQL Server实例。

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

Nicholas Carey answered 2019-08-11T07:10:40Z
8 votes

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

Stagg answered 2019-08-11T07:11:42Z
2 votes

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

Dévan Coetzee answered 2019-08-11T07:12:07Z
2 votes

刚刚遇到了完全相同的问题。 我在临时表中重命名了一些别名列,这些列由同一代码的另一部分进一步使用。 出于某种原因,SQL Server Management Studio未捕获此内容,并且它抱怨无效的列名称。

我只是创建一个新查询,将旧查询中的SQL代码粘贴到此新查询并再次运行。 这似乎正确地刷新了环境。

ApplePie answered 2019-08-11T07:12:42Z
2 votes

我最终关闭并重新启动Microsoft SQL Server Management Studio; 并为我修好了。 但在其他时候,只需启动一个新的查询窗口即可。

IAM_AL_X answered 2019-08-11T07:13:08Z
0 votes

在我的情况下,我在查询多个SQL语句时试图从错误的ResultSet中获取值。

Deepak Kataria answered 2019-08-11T07:13:34Z
0 votes

在我的情况下,似乎问题是一个奇怪的缓存问题。 上述解决方案并不奏效。

如果您的代码工作正常并且您在其中一个表中添加了一列,则会提供“无效的列名称”#39; 错误,上面的解决方案不起作用,试试这个:首先只运行代码部分来创建修改后的表,然后运行整个代码。

LoMaPh answered 2019-08-11T07:14:07Z
0 votes

包括这个答案,因为这是"无效列名sql"的最高结果。 谷歌上我没有看到这个答案。 就我而言,我收到了无效的列名,Id1,因为我在我的实体框架C#代码中的.HasForeignKey语句中使用了错误的id。 一旦我更改它以匹配.HasOne()对象的id,错误就消失了。

Daniel answered 2019-08-11T07:14:35Z
translate from https://stackoverflow.com:/questions/7260487/sql-server-reports-invalid-column-name-but-the-column-is-present-and-the-quer