为了账号安全,请及时绑定邮箱和手机立即绑定

EF4-所选的存储过程不返回任何列

EF4-所选的存储过程不返回任何列

海绵宝宝撒 2019-10-10 16:05:12
我在存储过程中查询,该存储过程使用一些动态SQL调用了一些链接服务器。我知道EF不喜欢这样,所以我专门列出了将要返回的所有列。但是,它仍然不喜欢那样。我在这里做错了什么?我只希望EF能够检测从存储过程返回的列,以便创建所需的类。请查看以下代码,这些代码构成了存储过程的最后几行:SELECT    #TempMain.ID,    #TempMain.Class_Data,    #TempMain.Web_Store_Class1,    #TempMain.Web_Store_Class2,    #TempMain.Web_Store_Status,    #TempMain.Cur_1pc_Cat51_Price,    #TempMain.Cur_1pc_Cat52_Price,    #TempMain.Cur_1pc_Cat61_Price,    #TempMain.Cur_1pc_Cat62_Price,    #TempMain.Cur_1pc_Cat63_Price,    #TempMain.Flat_Length,    #TempMain.Flat_Width,    #TempMain.Item_Height,    #TempMain.Item_Weight,    #TempMain.Um,    #TempMain.Lead_Time_Code,    #TempMain.Wp_Image_Nme,    #TempMain.Wp_Mod_Dte,    #TempMain.Catalog_Price_Chg_Dt,    #TempMain.Description,    #TempMain.Supersede_Ctl,    #TempMain.Supersede_Pn,    TempDesc.Cust_Desc,    TempMfgr.Mfgr_Item_Nbr,    TempMfgr.Mfgr_Name,    TempMfgr.Vendor_IDFROM    #TempMain        LEFT JOIN TempDesc ON #TempMain.ID = TempDesc.ID        LEFT JOIN TempMfgr ON #TempMain.ID = TempMfgr.ID
查看完整描述

3 回答

?
偶然的你

TA贡献1841条经验 获得超3个赞

EF不支持导入存储过程,这些存储过程从以下位置构建结果集:


动态查询

临时表

原因是要导入过程EF必须执行它。这种操作可能很危险,因为它可能会触发数据库中的某些更改。因此,EF在执行存储过程之前会使用特殊的SQL命令:


SET FMTONLY ON

通过执行此命令,存储过程将仅返回有关其结果集中各列的“元数据”,并且将不执行其逻辑。但是因为未执行逻辑,所以没有临时表(或内置的动态查询),因此元数据不包含任何内容。


您有两种选择(一种需要重写存储过程以不使用这些功能的选择除外):


手动定义返回的复杂类型(我猜应该可以)

使用技巧,仅用于添加开始时放置的存储过程SET FMTONLY OFF。这将允许您的SP的其余代码以正常方式执行。只需确保您的SP不会修改任何数据,因为这些修改将在导入期间执行!成功导入后,删除该hack。


查看完整回答
反对 回复 2019-10-10
?
慕工程0101907

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应该能够识别返回的列类型。


查看完整回答
反对 回复 2019-10-10
  • 3 回答
  • 0 关注
  • 544 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信