TVF输出缺少来自它引用的视图的计算列

时间:2013-03-28 22:35:23

标签: sql-server-2008-r2 user-defined-functions calculated-columns

我有一个带有计算列的视图,以及一个顶部的电视功能,(简化)如下:

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列数据,而且还可以向下滑动列标题(跳过计算列)。 然而,大多数奇迹般地,所有专栏的数据都保持不变!

executing 'select *' from source data, view directly and from function expanded (and wrapped) portion, showing moved column headers and data in place

我可以忍受计算列被“区分”并从结果集中推出的事实,但它只推出列标题,使用此函数搞乱所有内容,因为现在返回的列具有错误的数据类型。没有文件我能找到任何相关的内容。

有人知道发生了什么吗?

任何想法如何解决?我将用显式select * from vwEvent_A替换函数调用(添加必要的条件),但这个func存在的主要原因是代码重用.. [见下文]

编辑:点缀i-s(对于稍后阅读此内容的人),
- View确实被其他对象重用(至少到目前为止,它没有表现出任何类似的问题)。最近的修订版增加了作为罪魁祸首的计算列 - 存在func以提供单个最高优先级的行,然后在另一个sproc中进行OUTER APPLY。我没有找到更好/更简单的方法来做到这一点 - 刷新func(ALTER FUNC)甚至重新创建它(通过DROP FUNC / CREATE FUNC)没有任何影响(输出的差异)。

0 个答案:

没有答案