Предложение ORDER BY недопустимо, если также не указан TOP или FOR XML - PullRequest
14 голосов
/ 16 марта 2010

Я получаю «Предложение 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)

Ответы [ 5 ]

11 голосов
/ 16 марта 2010

Вы переместили предложение 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
7 голосов
/ 25 июля 2014

Альтернатива принятому ответу вы можете просто использовать 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 будет работать

2 голосов
/ 19 января 2016

В дополнение к принятым выше ответам из книги Внутри Microsoft SQL Server 2008: программирование на T-SQL , глава 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 не является одним.

2 голосов
/ 16 марта 2010

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

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 при построении запросов таким способом.

0 голосов
/ 16 марта 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...