我遇到了一些僵局。我有一个由一些 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);
在代码中运行时也会失败,因为它认为该列丢失。
有任何想法吗?
原文由 kidl33t 发布,翻译遵循 CC BY-SA 4.0 许可协议
我怀疑你有两个同名的表。一个由模式 ‘dbo’ (
dbo.PerfDiag
) 所有,另一个由用于连接到 SQL Server 的帐户的默认模式所有(类似于userid.PerfDiag
)。当你有一个对模式对象(例如表)的非限定引用时——一个没有由模式名称限定的引用——必须解析对象引用。通过按以下顺序搜索具有指定名称的适当类型(表)的对象来进行名称解析。名称解析为第一个匹配项:
非限定引用绑定到上述序列中的第一个匹配项。
作为一般推荐的做法,出于性能原因,应 始终 限定对模式对象的引用:
不合格的引用可能会使存储过程或查询的缓存执行计划无效,因为引用绑定到的架构可能会根据执行存储过程或查询的凭据而改变。这会导致重新编译查询/存储过程,从而影响性能。重新编译会导致编译锁被取出,从而阻止其他人访问所需的资源。
名称解析会减慢查询执行速度,因为必须进行两个探测才能解析到对象的可能版本(由“dbo”拥有)。这是通常的情况。只有当当前用户拥有指定名称和类型的对象时,单个探测器才能解析名称。
[编辑以进一步说明]
其他可能性是(无特定顺序):
仔细检查您的连接字符串并确保它们明确指定 SQL Server 实例名称和数据库名称。