SQL Server报告“列名无效”,但该列存在,并且查询通过management studio工作

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

但是,当我的代码试图运行相同的查询时,我得到了关于一个无效列相同的错误,并引发exception。 所有引用此列的查询都失败。

有问题的列最近被添加到数据库。 这是一个名为Incident_Begin_Time_ts的date列。

一个失败的例子是:

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

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

有任何想法吗?

我怀疑你有两个同名的表。 一个属于模式“dbo”( dbo.PerfDiag ),另一个属于用于连接SQL Server的帐户的默认模式(类似于userid.PerfDiag )。

如果对模式对象(如表)具有非限定引用(不受限于模式名称),则必须parsing对象引用。 名称parsing通过按照以下顺序search具有指定名称的适当types(表格)的对象。 名称parsing为第一个匹配项:

  • 在用户的默认模式下。
  • 在模式'dbo'下。

不合格的参考文献与上述序列中的第一场比赛相关联。

作为一般build议的做法,出于性能原因,应始终限定对模式对象的引用:

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

  • 名称parsing会降低查询的执行速度,因为必须对两个探针进行parsing才能parsing对象的可能版本(属于“dbo”)。 这是通常的情况。 单个探测器parsing名称的唯一时间是当前用户拥有指定名称和types的对象。

[编辑进一步注意]

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

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

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

只要按下Ctrl + Shift + R,然后看…

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

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

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