3 回答

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

TA貢獻(xiàn)1887條經(jīng)驗(yàn) 獲得超5個贊
或者,您可以創(chuàng)建一個用戶定義的表類型并將其返回。
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
現(xiàn)在,EF應(yīng)該能夠識別返回的列類型。
- 3 回答
- 0 關(guān)注
- 575 瀏覽
添加回答
舉報(bào)