3

重複
の可能性: EF4 - 選択したストアド プロシージャは列を返しません

#temp テーブルにデータを入力し、そのレコードに対して処理を行ってから、レコードを選択するストアド プロシージャがあります。

問題は、関数インポートを作成して [列情報の取得] をクリックすると、結果ペインに「選択したストアド プロシージャまたは関数は列を返しません」というメッセージが表示されることです。

データベースから直接実行すると、期待される結果セットが返されるため、実際に列が返されるという事実を知っています。

ストアド プロシージャは次のように要約できます。

SELECT P.PersonID, P.Surname, P.NickName, P.DateofBirth
INTO #SeriesCompleted   
FROM 
    Table1 T (NOLOCK)
INNER JOIN 
    Table2 P (NOLOCK) ON T.PID = P.PID
;
Select r.PID, SUM(rt.Distance) 'Distance'
INTO #Distance
FROM 
    #SeriesCompleted sc
    inner join table3 rsr (NOLOCK) on rsr.SeriesId = sc.SeriesId
    inner join table4 r (NOLOCK) on r.PID = sc.PID
    inner join table5 rt (NOLOCK) on rt.RouteID = r.RouteID
GROUP BY r.PID;

UPDATE #SeriesCompleted
SET Distance =  d.Distance
FROM #SeriesCompleted sc
INNER JOIN #Distance d on d.PID = sc.PPID;

--Here is where the result is returned.
SELECT distinct sc.PersonID, sc.NickName, sc.Surname, sc.DateofBirth, sc.NumberFinished, sc.Distance
FROM #SeriesCompleted SC

ストアド プロシージャを直接実行した場合の出力の (一部検閲された) 例を次に示します。

4

1 に答える 1

10

猛烈にグーグルで調べた後、答えに出くわしました:EF4-選択されたストアドプロシージャは列を返しません

EF は、動的クエリまたは一時テーブルを使用するストアド プロシージャからメタデータを取得できません。解決策は、複雑な戻り型を手動で作成するか、配置することでした

SET FMTONLY OFF

私のストアドプロシージャ定義で。もちろん、2 番目のオプションの危険性は、Visual Studio がメタデータ呼び出しを実行するときにストアド プロシージャが実行されることです。そのため、ストアド プロシージャが何も変更しない場合にのみ使用するのが理想的です。

更新: 別の方法は、ストアド プロシージャが実際に機能することを確認することです。他にできることは、必要な列を返すダミーのストアド プロシージャを作成し、それにバインドしてから実際のロジックを実行することです。

于 2013-01-28T12:25:50.187 に答える