SELECT DISTINCT tblJobReq.JobReqId
, tblJobReq.JobStatusId
, tblJobClass.JobClassId
, tblJobClass.Title
, tblJobReq.JobClassSubTitle
, tblJobAnnouncement.JobClassDesc
, tblJobAnnouncement.EndDate
, blJobAnnouncement.AgencyMktgVerbage
, tblJobAnnouncement.SpecInfo
, tblJobAnnouncement.Benefits
, tblSalary.MinRateSal
, tblSalary.MaxRateSal
, tblSalary.MinRateHour
, tblSalary.MaxRateHour
, tblJobClass.StatementEval
, tblJobReq.ApprovalDate
, tblJobReq.RecruiterId
, tblJobReq.AgencyId
FROM ((tblJobReq
LEFT JOIN tblJobAnnouncement ON tblJobReq.JobReqId = tblJobAnnouncement.JobReqId)
INNER JOIN tblJobClass ON tblJobReq.JobClassId = tblJobClass.JobClassId)
LEFT JOIN tblSalary ON tblJobClass.SalaryCode = tblSalary.SalaryCode
WHERE (tblJobReq.JobClassId in (SELECT JobClassId
from tblJobClass
WHERE tblJobClass.Title like '%Family Therapist%'))
当我尝试执行查询时,会导致以下错误。
Cannot sort a row of size 8130, which is greater than the allowable maximum of 8094
我查了一下,没找到任何解决方案。唯一的方法是在查询中截断(substring())“tblJobAnnouncement.JobClassDesc”,其列大小约为8000.
我们是否有任何解决方法,以便我不需要截断值。或者可以优化此查询? SQL Server 2000中的任何设置?
答案 0 :(得分:4)
SQL需要 SORT 的[非显而易见]原因是 DISTINCT 关键字。
根据数据和基础表结构,您可以取消此DISTINCT,因此不会触发此错误。
您很容易找到替代解决方案,即截断SELECT列表中的某些字段。
修改:回答“你能解释一下DISTINCT是什么原因吗?”
通常,满足DISTINCT要求的方式因
然而,与“DISTINCT查询”相关的所有可能的计划都涉及 *某些形式* 的排序的合格记录。在最简单的形式中,计划“拳头”产生符合条件的行(记录)列表(满足查询的WHERE / JOIN /等部分的记录列表),然后对此列表进行排序(可能包括一些重复项) ,只保留每个不同行的第一次出现。在其他情况下,例如,当仅选择几列并且当覆盖这些列的某些索引可用时,在查询计划中不使用显式排序步骤但是依赖于索引隐含地暗示“可排序性” “基础栏目。在其他情况下,查询优化器会选择涉及各种形式的合并或散列的步骤,这些最终也意味着比较两行的能力。
底线:DISTINCT意味着一些排序。
在问题的特定情况下,SQL Server报告并阻止查询完成的错误是“排序不可能在大于...的行上”和“DISTINCT”关键字是查询要求任何排序的唯一明显原因(BTW许多其他SQL结构暗示排序:例如UNION)因此删除DISTINCT的想法(如果它在逻辑上是可行的)。
实际上你应该删除它,用于测试目的,断言在没有DISTINCT的情况下,查询完成OK(如果只包括一些重复项)。一旦确认了这一事实,并且如果有效地查询可以产生重复的行,那么在没有DISTINCT关键字的情况下查看生成无重复查询的方法;涉及子查询的构造有时可用于此目的。
无关提示 ,是使用表别名,使用短字符串来避免重复这些长表名称。例如(只做了几张桌子,但你明白了......)
SELECT DISTINCT JR.JobReqId, JR.JobStatusId,
tblJobClass.JobClassId, tblJobClass.Title,
JR.JobClassSubTitle, JA.JobClassDesc, JA.EndDate, JA.AgencyMktgVerbage,
JA.SpecInfo, JA.Benefits,
S.MinRateSal, S.MaxRateSal, S.MinRateHour, S.MaxRateHour,
tblJobClass.StatementEval,
JR.ApprovalDate, JR.RecruiterId, JR.AgencyId
FROM (
(tblJobReq AS JR
LEFT JOIN tblJobAnnouncement AS JA ON JR.JobReqId = JA.JobReqId)
INNER JOIN tblJobClass ON tblJobReq.JobClassId = tblJobClass.JobClassId)
LEFT JOIN tblSalary AS S ON tblJobClass.SalaryCode = S.SalaryCode
WHERE (JR.JobClassId in
(SELECT JobClassId from tblJobClass
WHERE tblJobClass.Title like '%Family Therapist%'))
答案 1 :(得分:0)
仅供参考,在数据库上运行此SQL命令可以解决问题,如果它是由丢弃可变长度列后需要回收的空间引起的:
DBCC CLEANTABLE (0,[dbo.TableName])
答案 2 :(得分:0)
这是SQL Server 2000的限制。您可以:
将其拆分为两个查询并在其他地方合并
SELECT ID, ColumnA, ColumnB FROM TableA JOIN TableB
SELECT ID, ColumnC, ColumnD FROM TableA JOIN TableB
正确截断列
SELECT LEFT(LongColumn,2000)...
从SELECT
中删除所有冗余列SELECT ColumnA, ColumnB, --IDColumnNotUsedInOutput
FROM TableA
迁移SQL Server 2000