1

次のように、計算された列とその上に 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 *」を実行し、直接表示し、関数から 展開された (およびラップされた) 部分。移動された列ヘッダーとデータが所定の位置に表示されます

計算された列が「識別」され、結果セットから押し出されるという事実に耐えることができましたが、返された列のデータ型が間違っているため、列ヘッダーのみを押し出し、この関数を使用してすべてを台無しにしています。関連するものについて言及しているドキュメントは見つかりませんでした。

どうなってるか知ってる人いますか??

そして、それを修正する方法はありますか?関数呼び出しを明示的に (必要な条件を追加して) 置き換えますselect * from vwEvent_Aが、この func が存在する主な理由はコードの再利用でした.. [下記参照]

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

4

1 に答える 1

3

関数が作成されてから、計算列がビューに追加されたと思われます。

2 段階のソリューション:

  1. sp_refreshsqlmoduleビューから始めて、ビューと関数のメタデータを更新するために実行します。

     EXEC sp_refreshsqlmodule N'dbo.vwEvent_A';
     EXEC sp_refreshsqlmodule N'dbo.fnEventA_GetTopByRoom';
    
  2. SELECT *ビューや関数での使用をやめてください。これはまさに、これを行わない理由の 1 つです。また、両方のオブジェクトを作成WITH SCHEMABINDINGして、スキーマが同期しにくくなるようにすることをお勧めします (他のオブジェクトが依存するオブジェクトの出力を混乱させないようにする必要があります)。

于 2013-03-28T23:09:01.770 に答える