Select 无法对大小为8130的行进行排序,该行大于允许的最大值8094

Select 无法对大小为8130的行进行排序,该行大于允许的最大值8094,select,sql-server-2000,query-optimization,Select,Sql Server 2000,Query Optimization,当我尝试执行查询时,它会导致以下错误 SELECT DISTINCT tblJobReq.JobReqId , tblJobReq.JobStatusId , tblJobClass.JobClassId , tblJobClass.Title , tblJobReq.JobClassSubTitle , tblJobAnnouncement.JobClas

当我尝试执行查询时,它会导致以下错误

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%'))
我检查了一下,没有找到任何解决办法。唯一的方法是截断(substring())查询中的“tblJobAnnouncement.JobClassDesc”,该查询的列大小约为8000


我们是否有任何解决方法,以便我不需要截断这些值。或者可以优化此查询?SQL Server 2000中是否有任何设置?

SQL需要排序的[不明显]原因是DISTINCT关键字

根据数据和底层表结构的不同,您可能能够消除这种差异,因此不会触发此错误

您很容易找到另一种解决方案,即截断选择列表中的一些字段

编辑:回答“您能解释一下原因有多明显吗?”
一般来说,满足不同要求的方式因时间而异

  • 数据上下文(预期行数、是否存在索引、行大小…)
  • SQL实现的版本/品牌(查询优化器尤其会在每个新版本中接收新的或修改过的启发式,有时会在不同上下文中为各种构造生成备用查询计划)
然而,与“不同查询”相关的所有可能的计划都涉及对符合条件的记录进行*某种形式的排序。在最简单的形式中,计划“fist”生成符合条件的行(记录)列表(满足查询的WHERE/JOINs/etc.部分的记录列表),然后对该列表进行排序(可能包含一些重复项),只保留每个不同行的第一次出现。在其他情况下,例如,当只选择了几列,并且覆盖这些列的某些索引可用时,查询计划中不使用显式排序步骤,但对索引的依赖隐含地暗示了基础列的“可排序性”。在其他情况下,查询优化器会选择涉及各种形式的合并或散列的步骤,这些步骤最终也意味着可以比较两行。
底线:DISTINCT意味着某种排序。

在问题的特定情况下,SQL Server报告的错误和阻止查询完成的错误是“在大于…的行上不可能排序”,并且DISTINCT关键字是查询需要任何排序的唯一明显原因(顺便说一句,许多其他SQL构造意味着排序:例如UNION)因此,需要删除DISTINCT(如果逻辑上可能)。
事实上,出于测试目的,您应该删除它,以断言在没有DISTINCT的情况下,查询完成OK(如果只包含一些重复项)。一旦这一事实得到确认,并且如果查询能够有效地生成重复的行,那么就研究如何在不使用DISTINCT关键字的情况下生成重复的自由查询;涉及子查询的构造有时可用于此目的


一个不相关的提示是使用表别名,使用短字符串避免重复这些长表名。例如(只做了几张桌子,但你明白了…)


SQL需要排序的[不明显]原因是DISTINCT关键字

根据数据和底层表结构的不同,您可能能够消除这种差异,因此不会触发此错误

您很容易找到另一种解决方案,即截断选择列表中的一些字段

编辑:回答“您能解释一下原因有多明显吗?”
一般来说,满足不同要求的方式因时间而异

  • 数据上下文(预期行数、是否存在索引、行大小…)
  • SQL实现的版本/品牌(查询优化器尤其会在每个新版本中接收新的或修改过的启发式,有时会在不同上下文中为各种构造生成备用查询计划)
然而,与“不同查询”相关的所有可能的计划都涉及对符合条件的记录进行*某种形式的排序。在最简单的形式中,计划“fist”生成符合条件的行(记录)列表(满足查询的WHERE/JOINs/etc.部分的记录列表),然后对该列表进行排序(可能包含一些重复项),只保留每个不同行的第一次出现。在其他情况下,例如,当只选择了几列,并且覆盖这些列的某些索引可用时,查询计划中不使用显式排序步骤,但对索引的依赖隐含地暗示了基础列的“可排序性”。在其他情况下,查询优化器会选择涉及各种形式的合并或散列的步骤,这些步骤最终也意味着可以比较两行。
底线:DISTINCT意味着某种排序。

在问题的特定情况下,SQL Server报告的错误和阻止查询完成的错误是“在大于…的行上不可能排序”,并且DISTINCT关键字是查询需要任何排序的唯一明显原因(顺便说一句,许多其他SQL构造意味着排序:例如UNION)因此,需要删除DISTINCT(如果逻辑上可能)。
事实上,出于测试目的,您应该删除它,以断言在没有DISTINCT的情况下,查询完成OK(如果只包含一些重复项)。一旦这一事实得到确认,并且如果查询能够有效地生成重复的行,那么就研究如何在不使用DISTINCT关键字的情况下生成重复的自由查询;涉及子查询的构造有时可用于此目的


一个不相关的提示是使用tab
Cannot sort a row of size 8130, which is greater than the allowable maximum of 8094
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%'))
DBCC CLEANTABLE (0,[dbo.TableName])
SELECT ID, ColumnA, ColumnB FROM TableA JOIN TableB
SELECT ID, ColumnC, ColumnD FROM TableA JOIN TableB
SELECT LEFT(LongColumn,2000)...
SELECT ColumnA, ColumnB, --IDColumnNotUsedInOutput
FROM TableA