我有一个带有计算列的视图,以及一个顶部的电视功能,(简化)如下:
create view dbo.vwEvent_A as
select ea.idEvent, ea.dtEvent, ea.cSys, ..
, sd.sSGJR + '-' + right('0' + cast(ea.tiBtn as varchar), 2) [sSGJRB]
from tbEvent_A ea
inner join ..
left outer join vwDevice sd on sd.cSys = ea.cSys ..
create function dbo.fnEventA_GetTopByRoom
(
@cSys char( 1 )
, @tiGID tinyint
)
returns table
as
return
select top 1 *
from vwEvent_A
where bActive > 0 and cSys = @cSys
order by siIdx desc, tElapsed
执行函数时,我不仅可以减少1列数据,而且还可以向下滑动列标题(跳过计算列)。 然而,大多数奇迹般地,所有专栏的数据都保持不变!
我可以忍受计算列被“区分”并从结果集中推出的事实,但它只推出列标题,使用此函数搞乱所有内容,因为现在返回的列具有错误的数据类型。没有文件我能找到任何相关的内容。
有人知道发生了什么吗?
任何想法如何解决?我将用显式select * from vwEvent_A
替换函数调用(添加必要的条件),但这个func存在的主要原因是代码重用.. [见下文]
编辑:点缀i-s(对于稍后阅读此内容的人),
- View确实被其他对象重用(至少到目前为止,它没有表现出任何类似的问题)。最近的修订版增加了作为罪魁祸首的计算列
- 存在func以提供单个最高优先级的行,然后在另一个sproc中进行OUTER APPLY
。我没有找到更好/更简单的方法来做到这一点
- 刷新func(ALTER FUNC
)甚至重新创建它(通过DROP FUNC / CREATE FUNC
)没有任何影响(输出的差异)。