2013-12-23 66 views
4

這是一個存儲過程EF6無法導入存儲過程

ALTER PROCEDURE [dbo].[StoredProc1] 
(
    @PageIndex INT = 1, 
    @RecordCount INT = 20, 
    @Gender NVARCHAR(10) = NULL 
) 
AS 
BEGIN 
    SET NOCOUNT ON ; 

WITH tmp1 AS 
( 
    SELECT u.UserId, MIN(cl.ResultField) AS BestResult 
     FROM [Users] u 
     INNER JOIN Table1 tbl1 ON tbl1.UserId = u.UserId 
    WHERE (@Gender IS NULL OR u.Gender = @Gender) 
      GROUP BY u.UserID 
    ORDER BY BestResult 
     OFFSET @PageIndex * @RecordCount ROWS 
     FETCH NEXT @RecordCount ROWS ONLY 
)  
SELECT t.UserId, t.BestResult, AVG(cl.ResultField) AS Average 
INTO #TmpAverage 
FROM tmp1 t 
    INNER JOIN Table1 tbl1 ON tbl1.UserId = t.UserId 
GROUP BY t.UserID, t.BestResult 
ORDER BY Average 

SELECT u.UserId, u.Name, u.Gender, t.BestResult, t.Average 
    FROM #tmpAverage t 
    INNER JOIN Users u on u.UserId = t.UserId 

DROP TABLE #TmpAverage 
END 

當我使用EF6加載存儲的過程,然後轉到「編輯功能導入」對話框中,沒有列是一個簡化版本在那裏顯示。即使在我要求檢索列時,我也會收到SP未返回列的消息。當我從SMMS執行SP時,會得到預期的[UserId,Name,Gender,BestResult,Average]記錄列表。

任何想法如何調整存儲過程或EF6使其工作? 在此先感謝

+0

@marc_s我是什麼談論的是「返回集合」對話框,即使點擊「獲取列信息」按鈕,它也會說存儲過程不返回任何列。如果我用一個簡單的選擇field1,field2,來自table1的field3 ...替換存儲的proc內容...那些會在該對話框上顯示。我會更新這個問題,以便更清楚。謝謝。 – Johnny

+0

我認爲問題出現在TEMP表中。請參見[this](http://stackoverflow.com/a/7131344/1387612) – janisz

+2

它並沒有很好地處理像'#temp'這樣的表。我只是暫時改變定義來選擇所需列名和數據類型的虛擬結果集。導入到EF然後用適當的定義替換。 –

回答

1

感謝上面的意見,答案是不幸的是,EF6不能很好地處理存儲過程上的TMP表。

單程解決方案如下:
1)註釋掉存儲過程中的所有臨時表調用。

2)更改存儲過程對函數返回與符合預期的結果

3是完全相同的列的名字是假的結果)導入存儲過程到EF6

4)雙擊進口/存儲過程的名稱

5)在編輯功能導入對話框,檢索列和創建新的複雜類型,將匹配以生成所有的假列

6)CTRL +保存C#代碼

7)重新更新存儲過程,方法是刪除假結果集並用Temp表取消註釋。

這應該做的工作。

P.S.特別感謝幫助我的人指出了正確的地方!

0

有時工作到下面的語句添加到存儲過程:

set fmtonly off 

但儘管如此,在不離開這個說法 - 只用它而產生的結果集