我有以下SQL应该抛出错误:
不明确的列名
由于conferencetitle
列在 2 个表中; course
和coursesession
.
请注意,我只选择此列一次。
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上运行查询。
- 更改顺序 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 修复了这个问题。