You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server 2022函数中ORDER BY位置索引报错问题咨询

问题描述

在SQL Server 2016中正常运行的自定义标量函数,因使用ORDER BY位置索引而非列名,在SQL Server 2022执行时触发报错:

The ORDER BY position number 2 is out of range of the number of items in the select list

但将函数内的代码单独作为脚本运行却能正常执行,具体示例如下:

创建函数代码

create FUNCTION [dbo].[TestingOrderBy]() returns INT
  as
  begin
    declare @VR int, @Order int

    select top 1
    @VR = [version_revision],
    @Order = case when L.[id] > 1000 then 1 else 99 end
   from msdb.[dbo].[msdb_version] L
    order by 2 asc, L.[version_major] desc

    return @VR
  end

执行函数触发错误

select dbo.TestingOrderBy()

单独运行函数内逻辑(正常执行)

declare @VR int, @Order int

select top 1
@VR = [version_revision],
@Order = case when L.[id] > 1000 then 1 else 99 end
from msdb.[dbo].[msdb_version] L
order by 2 asc, L.[version_major] desc

select @VR
问题原因

这是SQL Server 2022对标量值函数的查询优化逻辑调整导致的差异:

  • 在标量函数上下文里,优化器会分析函数的返回值仅依赖@VR变量,未被后续使用的@Order变量对应的SELECT列表项会被优化器忽略,此时SELECT列表实际只剩1个有效项,ORDER BY 2就会因超出范围报错。
  • 而单独运行脚本时,不属于函数的封闭上下文,优化器不会做这种“精简”处理,SELECT列表会完整保留两个赋值项,ORDER BY 2能正常对应到case表达式,因此可以正常执行。

内容的提问来源于stack exchange,提问作者Cristina

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:35:03