【发布时间】:2011-08-19 01:21:11
【问题描述】:
前提:应用程序代码不能更改。条件非常具体。我正在寻找一些书外的东西,如果可以的话,这是最后的解决方法。
我有一个生成 2 到 7 条记录的表值函数(内联)。有时可能只有 1 个或最多 15 个(但很少)。
该功能仅由应用程序以这种方式使用,没有任何ORDER BY。
select * from dbo.myfunction(...)
根据您的经验,有什么方法可以保证确保(就您使用特定技术观察到的情况而言)返回的结果按第二列排序?列是:varchar(3)、datetime、varchar(50)。
不要让我开始select *,它是INTENTIONAL,因此无论我将来显示多少列,前端都会显示该功能。
根据经验,使用单个索引(集群 PK)来遍历数据,任何当前版本的 SQL Server 和 SP 级别都应该始终对
你的想法?我宁愿把理论排除在讨论之外。如果您能坚持实践经验,并在家中继续讲道最佳实践,我也将不胜感激。
更新 这就是现在的样子
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
- 如果您查看以上内容,@RES 的填充是按所需顺序手动完成的。
- @RES 有一个集群 PK 代表插入的订单。
- 列足够小,20 行应始终适合单个 8K 页面
这是否可行(使用来自应用层的直接 SELECT)?
【问题讨论】:
-
不,不能保证。如果您需要保证,请在应用程序中添加
ORDER BY。这就是保证的执行方式。这不是关于最佳实践的布道,这只是事实......查询优化器可以选择以它认为最有效的任何方式对您的结果进行排序。是的,这可能会发生在 20 行中,并且可能会随着基表上的统计信息更改、累积更新、服务包、升级等而发生变化。 -
优化器不是我写的,所以我不能告诉你它到底做了什么。但我可以告诉你,这是由地球上一些最聪明的人编写的一段极其复杂的代码。我怀疑他们会告诉你它是如何工作的,因为这也是 SQL Server 表现如此出色的原因之一,但我敢打赌,他们会告诉你我告诉你的同样的事情。 不要依赖观察到的订单行为来保持不变。如果您需要保证,请添加
ORDER BY。 -
人们一直在使用无证的东西,但通常他们了解风险,并且不会对他们的行为做出任何保证(除非他们不知道更好,或者不在乎)。我只是不明白将 ORDER BY 2 添加到您的应用程序代码有什么困难。如果它是我的应用程序,我会在有明确保证的情况下晚上睡得更好……而在你花时间制作这个问题并贬低任何质疑你的人的时候,你本可以做到这一点。尽情享受你的问题吧。
-
@Aaron。假设乔得了癌症。医生(专家)在 1 个月内宣布终末期,没有追索权。乔应该寻求替代医学/祈祷/巫毒吗?好的,我没有提到APP不能更改。但这就是我所在的地方,我有一个问题,正在寻找一种解决方法,无证,无保证或其他。这不是一个包罗万象的问题,只是一个非常具体的案例和条件。感谢您在这个问题上的时间,但如果您觉得您需要向我扔 MSSQL 圣经,我有一个暗示,我可以在任何其他日子反对您。
-
好吧,好吧,如果你想依赖你理解不能保证的行为,你为什么还要麻烦问这个问题?你似乎事先就知道会是什么反应。您需要决定后果是否值得......当这个应用程序在没有明确说明的情况下对订单进行假设,突然开始收到意外订单的结果时,究竟会发生什么?
标签: sql sql-server function user-defined-functions