3 回答

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

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