次のように、計算された列とその上に TV 関数を含むビューがあります (簡略化)。
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 が存在する主な理由はコードの再利用でした.. [下記参照]
編集:ドットを付けるには(後でこれを読む人のために)、
-ビューは実際に他のオブジェクトによって再利用されます(少なくともこれまでのところ、同様の問題は見られませんでした)。犯人である計算列は、最近のリビジョンによって追加されました。
- func は、優先度の最も高い単一の行を提供するために存在し、それはOUTER APPLY
別の sproc で -ed されます。それを行うためのより良い/簡単な方法が見つかりませんでした。
- func をリフレッシュ ( by ALTER FUNC
) し、再作成 ( by DROP FUNC / CREATE FUNC
) しても何の効果もありませんでした (出力の違い)。