Sql server 除非还指定了TOP或FOR XML,否则ORDER BY子句无效

Sql server 除非还指定了TOP或FOR XML,否则ORDER BY子句无效,sql-server,asp-classic,Sql Server,Asp Classic,除非还指定了TOP或FOR XML,否则ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效。错误代码如下。我最初有两个表,区域和类别。当我删除类别表时,我开始收到此错误 Select Case SIDX Case "ID" : SQLCONT1 = " AdsAreasID" Case "Page" : SQLCONT1 = " AdsAreasName" Case Else : SQLCONT1 = " AdsAreasID"

除非还指定了TOP或FOR XML,否则ORDER BY子句在视图、内联函数、派生表、子查询和公共表表达式中无效。错误代码如下。我最初有两个表,区域和类别。当我删除类别表时,我开始收到此错误

    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)

在重写时,您将ORDERBY子句移动到了内部查询。在WHERE子句后添加括号和标识符,以便ORDERBY应用于外部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

问题似乎是您试图将ORDERBY子句应用于禁止的内部select语句。您应该只将ORDERBY子句应用于最外层的select语句。

如果您查看由代码生成的查询,这会有所帮助:

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注入关注以这种方式构建查询,但这一切都是如此。

除了可接受的答案,您只需使用前100%即可

例如:

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 

现在,您的订单将起作用

除了上述公认的答案外,还可以从《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是结果集规范的一部分,其中as ORDER BY单独不是,它只指定表示的细节。因此,视图定义中允许TOP和ORDER BY或ORDER BY和FOR XML,但不能单独使用ORDER BY


我一定是瞎了。非常感谢你!我遇见你之前是瞎的