Предложение 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)
Ответы
Ответ 1
Вы перевели предложение 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
Ответ 2
Альтернативный принятый ответ можно просто использовать 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
будет работать
Ответ 3
Это поможет, если вы посмотрите на запрос, который генерируется кодом:
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-инъекциями при построении запросов таким образом.
Ответ 4
В дополнение к вышеприведенным ответам из книги 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 не является.
Ответ 5
Похоже, проблема заключается в том, что вы пытаетесь применить оператор order by к внутреннему select select, который запрещен. Вы должны применить предложение order by только к самому внешнему оператору select.