3 回答

TA貢獻1841條經驗 獲得超3個贊
EF不支持導入存儲過程,這些存儲過程從以下位置構建結果集:
動態查詢
臨時表
原因是要導入過程EF必須執行它。這種操作可能很危險,因為它可能會觸發數據庫中的某些更改。因此,EF在執行存儲過程之前會使用特殊的SQL命令:
SET FMTONLY ON
通過執行此命令,存儲過程將僅返回有關其結果集中各列的“元數據”,并且將不執行其邏輯。但是因為未執行邏輯,所以沒有臨時表(或內置的動態查詢),因此元數據不包含任何內容。
您有兩種選擇(一種需要重寫存儲過程以不使用這些功能的選擇除外):
手動定義返回的復雜類型(我猜應該可以)
使用技巧,僅用于添加開始時放置的存儲過程SET FMTONLY OFF。這將允許您的SP的其余代碼以正常方式執行。只需確保您的SP不會修改任何數據,因為這些修改將在導入期間執行!成功導入后,刪除該hack。

TA貢獻1887條經驗 獲得超5個贊
或者,您可以創建一個用戶定義的表類型并將其返回。
CREATE TYPE T1 AS TABLE
( ID bigint NOT NULL
,Field1 varchar(max) COLLATE Latin1_General_CI_AI NOT NULL
,Field2 bit NOT NULL
,Field3 varchar(500) NOT NULL
);
GO
然后在過程中:
DECLARE @tempTable dbo.T1
INSERT @tempTable (ID, Field1, Field2, Field3)
SELECT .....
....
SELECT * FROM @tempTable
現在,EF應該能夠識別返回的列類型。
- 3 回答
- 0 關注
- 578 瀏覽
添加回答
舉報