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 关注
- 544 浏览
添加回答
举报