SQL Server 不检测歧义



我有以下SQL应该抛出错误:

不明确的列名

由于conferencetitle列在 2 个表中; coursecoursesession .

请注意,我只选择此列一次。

SELECT 
    CourseSessionID, CourseSessionNum, 
    usrCourseSessionNum, 
    CourseSession.ConferenceTitle, 
    ConferenceDescription, MaxParticipants, 
    NumParticipants, 
    openSeats = ISNULL(MaxParticipants, 0) - ISNULL(NumParticipants, 0), 
    WaitingList, WaitingListCap, 
    SessionCancelled, 
    StartDate, SchedTime, SchedDate, StartTime, 
    ShowThruDate, CourseSession.RegStartDate, 
    ExtraCostCreditInfo, Days, IsMaster, IsMasterNoCredit, 
    CutOffDate, DisableConfRes, MasterSessionId, 
    Case When Days = 1 Then 'Scheduled Date/Time' Else 'Scheduled Date(s)/Time(s)' End As daysMessage, 
    Location.Name, econtent, InstructorId, PaymentInstr, 
    SpecialInstr, ContactName, ContactEmail, ContactPhone, 
    ConfCWFunctionType, ConfCWFunctionType_opt, PageNumber, 
    VideoTeleConference,  CourseType, ConferenceRequiredInd, 
    DisableConfRes, ShowSeatsRemainingOnPublic, LinkedSessionID, 
    CourseSession.CourseNum, PublicStandardKey, 
    PublicMasterKey, PublicBreakoutKey 
FROM 
    CourseSession 
LEFT OUTER JOIN 
    Location ON CourseSession.LocNum = Location.LocNum 
INNER JOIN
    Course On CourseSession.CourseNum = Course.CourseNum 
WHERE 
    Course.CourseNum = 1944 
    AND (Course.DisplayStartingDate IS NULL 
         OR DATEDIFF(n, Course.DisplayStartingDate, GETDATE()) >= 0) 
    AND (CourseSession.DisplayDate IS NULL 
         OR DATEDIFF(n, CourseSession.DisplayDate, GETDATE()) >= 0) 
    AND ((CourseType = 0 AND CourseSession.ShowThruDate + ' 11:59:59 PM' >= GetDate()) OR (CourseType = 1 And Course.ConfShowThruDate + ' 11:59:59 PM' >= GetDate() AND CourseSession.ShowThruDate + ' 11:59:59 PM' >= GetDate())) AND MasterSessionID Is Null  AND SessionCancelled = 0 Order By PageNumber, ConferenceSortOrder, StartDate, StartTime, LinkedSessionID, ConferenceTitle,CASE WHEN numparticipants < Maxparticipants THEN 0 ELSE 1 END, Location.Name 

对于使用该应用程序的不同客户端,我有类似(实际上是相同的(数据库结构。

我观察到此查询仅对少数客户端'Ambiguous column name'错误,而对于其他客户端,它工作正常。

我无法弄清楚其中的原因。

编辑:我在相同版本的SQL Server 2008上运行查询。

  1. 更改顺序 by 子句可以解决此问题;但我需要找到为什么即使我运行相同的数据库,其他数据库上也没有错误查询具有相同数据库结构的它们。

问题出在 ORDER 语句中,您没有指定要使用的ConferenceTitle

ORDER BY PageNumber, ConferenceSortOrder, StartDate, StartTime, LinkedSessionID, Course.ConferenceTitle

更改顺序 by 子句可以解决此问题;但我需要找到为什么 即使我运行相同的查询,其他数据库上也没有错误 在它们上具有相同的数据库结构。

SQL Server 2000 和 SQL Server 2005 之间的行为已更改。

阅读以下连接项的Microsoft答案,了解有关为什么这样做的更多详细信息:

  • 行为更改 2000->2005:两次使用列的列名不明确错误

感谢您的报告。此更改是设计使然,并且是作为完成的 使列名绑定更多的总体努力的一部分 可预测,并与 SQL 标准保持一致。其中 更改是:不忽略列前缀和限制列 引用由 2 部分组成的名称,而不是允许更多前缀。这是 完成以帮助发现未以作者身份运行的查询 有意或有拼写错误或剪切/粘贴错误。在大多数调查中 案例,这已被证明是有益的。正如您所注意到的,原始的 行为在向后兼容模式下保持,所以如果你需要这个 查询 若要继续按原样运行,需要使用兼容模式。

要检查是否确实如此,您可以执行的操作是运行以下查询:

SELECT compatibility_level
FROM sys.databases WHERE name = 'DatabaseName'

如果结果为 80 或更低,则表示您正在运行 SQL Server 2000 兼容性,因此不会遇到此错误。

有关更多详细信息,请参阅兼容性级别 80 和级别 90 之间的差异的第 3 项。

> 2008 错误地使用别名来标识要排序的内容。 根据我的经验,2008R2 修复了这个问题。