保证表值函数结果的顺序

Ric*_*iwi -2 sql sql-server function user-defined-functions

PREMISE:无法更改应用程序代码.条件非常具体.我正在寻找书籍上的东西,如果可能的话,最后的解决方法.

我有一个表值函数(内联),产生2到7条记录.有时它可能只有1或高达15(但很少).

该函数仅以这种方式由应用程序使用,没有任何ORDER BY.

select * from dbo.myfunction(...)
Run Code Online (Sandbox Code Playgroud)

根据您的经验,是否有任何方法可以确保(就您使用特定技术所观察到的那样)第二列按顺序返回结果?列是:varchar(3),datetime,varchar(50).不要让我开始选择*,它是INTENTIONAL,因此前端将显示许多列,我将来会显示该功能.

根据经验,使用单个索引(聚类PK)来遍历数据,任何当前版本的SQL Server和SP级别应始终在<20条记录上执行简单的INDEX SCAN而不进行并行操作,从而在应用程序选择中为我提供有序结果.

你的意见?我更愿意将理论排除在讨论之外.如果你能坚持实践经验并在家里继续讲述最佳实践,我也会很感激.


更新 这就是它现在的样子

create function dbo.myfunction(....)
returns @RES table
    (
    [#] int identity primary key clustered,
    [Varchar3Col] varchar(3),
    [DateTimeCol] datetime,
    [Varchar50Col] varchar(50)
    ) as
BEGIN
declare @RES2 table
    (
    rn int,
    [Varchar3Col] varchar(3),
    [DateTimeCol] datetime,
    [Varchar50Col] varchar(50)
    )

insert @RES2
select rn=row_number() over (order by action_time),
    [Varchar3Col]
    [DateTimeCol]
    [Varchar50Col]
from (.....)
inner join (.....) ON (.....)

declare @i int
set @i = 0
while @@rowcount > 0 begin
    set @i=@i+1
    insert @RES
    select [Varchar3Col], [DateTimeCol], [Varchar50Col]
    from @RES2
    where rn=@i
end
return
END
GO
Run Code Online (Sandbox Code Playgroud)
  • 如果你看一下上面的内容,@RES的数量是按照所需的顺序依次完成的.
  • @RES有一个表示插入顺序的聚簇PK.
  • 列足够小,20行应始终适合单个8K页

这是否有效(使用来自应用层的直接SELECT)?

Rem*_*anu 7

对于内联TVF,没有什么能真正起作用.不仅如此,内联TVF甚至可以返回比您认为的更多的行,并且在TVF执行后将对行进行修整(基本上,TVF定义中的谓词可以从TVF中拉出并移动到查询中的其他位置树).有关这种情况的示例,请参阅T-SQL函数并不意味着执行的某个顺序.

将内联TVF转换为多语句将引入一些程序顺序,因为语句不能无序执行,但TVF结果可能会被优化器生成的计划重新排序,排序,拆分,假脱机,基本上被破坏,并且最后打破了关于输出顺序的假设.我担心如果你必须有一定的执行顺序,游标是你最好的朋友.