Предложение ORDER BY недопустимо, если не указано также TOP или FOR XML.

Я получаю «Предложение ORDER BY недопустимо в представлениях, встроенных функциях, производных таблицах, подзапросах и общих табличных выражениях, если также не указано TOP или FOR XML». ошибка со следующим кодом. Изначально у меня было две таблицы: ADSAREAS и CATEGORIES. Я начал получать эту ошибку, когда удалил таблицу CATEGORIES.

    Select Case SIDX  
     Case "ID" : SQLCONT1 = " AdsAreasID"
     Case "Page" : SQLCONT1 = " AdsAreasName"
     Case Else : SQLCONT1 = " AdsAreasID"  
End Select   
Select Case SORD  
     Case "asc" : SQLCONT2 = " ASC"
     Case "desc" : SQLCONT2 = " DESC"
     Case Else : SQLCONT2 = " ASC"  
End Select   
''# search feature --->
Select Case SEARCHFIELD  
     Case "ID" : SQLSFIELD = "AND AdsAreasID"
     Case "Ads Areas" : SQLSFIELD = "AND AdsAreasName"
     Case Else : SQLSFIELD = ""  
End Select  
Select Case SEARCHOPER  
     Case "eq" : SQLSOPER = " = " & SEARCHSTRING
     Case "ne" : SQLSOPER = " <> " & SEARCHSTRING
     Case "lt" : SQLSOPER = " <" & SEARCHSTRING
     Case "le" : SQLSOPER = " <= " & SEARCHSTRING    
     Case "gt" : SQLSOPER = " >" & SEARCHSTRING
     Case "ge" : SQLSOPER = " >= " & SEARCHSTRING
     Case "bw" : SQLSOPER = " LIKE '" & SEARCHSTRING & "%' "
     Case "ew" : SQLSOPER = " LIKE '%" & SEARCHSTRING & "' "
     Case "cn" : SQLSOPER = " LIKE '%" & SEARCHSTRING & "%' "
     Case Else : SQLSOPER = ""  
End Select  
''# search feature --->

SQL = "SELECT * FROM ( SELECT A.AdsAreasID, A.AdsAreasName, ROW_NUMBER() OVER (ORDER BY A.AdsAreasID) As Row"
SQL = SQL & " FROM ADSAREAS A"
SQL = SQL & " WHERE Row > ("& RecordsPageSize - RecordsPerPage &") AND Row <= ("& RecordsPageSize &") ORDER BY" & SQLCONT1 & SQLCONT2
Set objXML = objConn.Execute(SQL)

person zurna    schedule 16.03.2010    source источник


Ответы (5)


Вы переместили предложение ORDER BY во внутренний запрос при его переписывании. Добавьте круглые скобки (и идентификатор) после предложения WHERE, чтобы вместо этого ORDER BY применялся к внешнему SELECT.

SQL = "SELECT * FROM ( SELECT A.AdsAreasID, A.AdsAreasName, ROW_NUMBER() OVER (ORDER BY A.AdsAreasID) As Row"
SQL = SQL & " FROM ADSAREAS A"
SQL = SQL & " WHERE Row > ("& RecordsPageSize - RecordsPerPage &") AND Row <= ("& RecordsPageSize &")) inner ORDER BY" & SQLCONT1 & SQLCONT2
person tvanfosson    schedule 16.03.2010
comment
Должно быть, я ослеп. Большое спасибо! - person zurna; 16.03.2010
comment
Я был слеп, пока не встретил тебя - person Marin; 12.11.2012

В качестве альтернативы принятому ответу вы можете просто использовать TOP (100) PERCENT

Например:

SELECT table1Col, ...
FROM   yourTABLE1
JOIN   -- doesn't matter what join you use
( SELECT TOP (100) PERCENT
         table2Col, ...
  FROM   yourTABLE2
  ORDER BY table2Col,....
) AS TB2 ON yourTABLE1.Col = TB2.Col 

теперь ваш ORDER будет работать

person WiiMaxx    schedule 25.07.2014

Было бы полезно, если бы вы посмотрели на запрос, который генерируется кодом:

SELECT * 
FROM (
  SELECT 
    A.AdsAreasID, 
    A.AdsAreasName, 
    ROW_NUMBER() OVER (ORDER BY A.AdsAreasID) As Row
  FROM ADSAREAS A
  WHERE 
    Row > ("& RecordsPageSize - RecordsPerPage &") 
    AND Row <= ("& RecordsPageSize &")
  ORDER BY" & SQLCONT1 & SQLCONT2

Обратите внимание, что вам не хватает закрывающего символа ), и если бы он был помещен в конец, ORDER BY был бы внутри внутреннего запроса, а не во внешнем, что недопустимо. Вам лучше полностью удалить внешний запрос. Это бесполезно.

И это несмотря на проблемы с SQL-инъекцией при построении запросов таким образом.

person Welbog    schedule 16.03.2010

В дополнение к принятым выше ответам в книге Inside Microsoft SQL Server 2008: T-SQL Programming, глава 1, стр. 4, говорится:

Обратите внимание, что ошибка не говорит о том, что ORDER BY полностью запрещен; скорее, это указывает на пару исключений, где это разрешено - когда также указано TOP или FOR XML. Помните, что и TOP, и FOR XML являются расширениями T-SQL, а не стандартными элементами SQL. TOP и ORDER BY или ORDER BY и FOR XML являются частью спецификации набора результатов, в то время как ORDER BY не является таковой, а только указывает детали представления. Следовательно, в определении представления разрешены TOP и ORDER BY или ORDER BY и FOR XML, а не только ORDER BY.

person Yawar Murtaza    schedule 18.01.2016

Похоже, проблема в том, что вы пытаетесь применить предложение order by к внутреннему оператору select, что запрещено. Вы должны применять предложение order by только к самому внешнему оператору select.

person Andrew Bezzub    schedule 16.03.2010