web-dev-qa-db-ja.com

TOPまたはFOR XMLも指定されていない限り、ORDER BY句は無効です。

「ORDER BY句は、TOPまたはFOR XMLも指定されていない限り、ビュー、インライン関数、派生テーブル、サブクエリ、および共通テーブル式では無効です。」次のコードでエラーが発生しました。最初は2つのテーブル、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)
14
zurna

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
11
tvanfosson

受け入れられた回答の代わりに、単に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が機能します

7
WiiMaxx

上記の受け入れられた回答に加えて、本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は結果セット仕様の一部です。ORDERBYだけではなく、プレゼンテーションの詳細を指定するだけです。したがって、TOPとORDER BY、またはORDER BYとFOR XMLはビュー定義で許可されますが、ORDER BYだけでは許可されません。

2
Yawar Murtaza

問題は、禁止されている内部のselectステートメントにorder by句を適用しようとしていることです。最も外側のselectステートメントにのみ、order by句を適用する必要があります。

0
Andrew Bezzub