【问题标题】:The ORDER BY clause is invalid in views, inline functions, derived tables, subqueriesORDER BY 子句在视图、内联函数、派生表、子查询中无效
【发布时间】:2013-08-06 16:51:22
【问题描述】:

我的存储过程是这样的:

alter PROCEDURE [dbo].[ParkingDeatailsReportnewstack] 
      @startdate NVARCHAR(100),
      @enddate NVARCHAR(100)AS
BEGIN
    DECLARE  @cols AS NVARCHAR(MAX) , @query AS NVARCHAR(MAX)

    SELECT @cols = STUFF((  SELECT DISTINCT ',' + QUOTENAME(Vtype)
    FROM dbo.VType_tbl FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '')

    SET @query =
        'SELECT  LocName,Date, ' + @cols + '
         from  ( 
                select  l.LocName,v.Vtype, convert(date, dtime) as Date 
                from Transaction_tbl t 
                join VType_tbl v on t.vtid = v.vtid 
                join dbo.Location_tbl l on t.locid=l.Locid
                where dtime between ''' + @startdate + ''' and ''' + @enddate + '''  order by l.LocName
         ) d
         pivot (
                count(Vtype) for Vtype in (' + @cols + ')
         ) p '  

    EXEC sys.sp_executesql @query
End

我想按升序获取我的 locname,但同时给出 order by l.LocName 出现错误:ORDER BY 子句在视图、内联函数、派生表、子查询中无效

【问题讨论】:

  • 您是否尝试过在枢轴后移动ORDER BY LocName?那么在) p 之后呢?
  • 不管怎样,存储过程不需要BEGINEND 语句。
  • 我尝试在 p 之后移动订单,那时我收到这样的错误“无法绑定多部分标识符“l.LocName”
  • @user2648161 不要使用别名,只需使用LocName
  • 请修正您的 proc 名称的拼写,否则维护人员将永远诅咒您的名字。

标签: sql-server


【解决方案1】:

我们可以通过在视图定义中添加 TOP 100 PERCENT 子句来非常轻松地解决问题。 尝试使用这种方式 - http://www.sqlpassion.at/archive/2015/05/25/the-ambiguity-of-the-order-by-in-sql-server/

【讨论】:

  • 当您无法将订单提取到外部查询时的更好解决方案。谢谢!
【解决方案2】:

尝试将您的 order by 子句迁移到 outermost 选择语句中——order by 唯一有意义的地方。

类似

select LocName ,
       ...
from ...
order by LocName

或者,甚至更简单,将原始的、复杂的select 包装在一个唯一目的是排序的外部选择中,按照以下几行:

select *
from ( select
       ...   
     ) t
order by t.x, t.y , ... 

【讨论】:

  • 查看我修改后的答案。
猜你喜欢
  • 1970-01-01
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
相关资源
最近更新 更多