sql-server - EF4 - 选定的存储过程不返回任何列

标签 sql-server entity-framework-4 temp-tables

我在一个存储过程中进行查询,该存储过程使用一些动态 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_ID
FROM
    #TempMain
        LEFT JOIN TempDesc ON #TempMain.ID = TempDesc.ID
        LEFT JOIN TempMfgr ON #TempMain.ID = TempMfgr.ID

最佳答案

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

  • 动态查询
  • 临时表

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

SET FMTONLY ON

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

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

  • 手动定义返回的复杂类型(我想它应该有效)
  • 使用 hack,只是为了添加存储过程,SET FMTONLY OFF。这将允许 SP 的其余代码以正常方式执行。只需确保您的 SP 不会修改任何数据,因为这些修改将在导入期间执行!成功导入后删除该黑客行为。

关于sql-server - EF4 - 选定的存储过程不返回任何列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7128747/

相关文章:

sql-server - SQL 服务器 : clustered index slow

c# - DbContext 表映射

entity-framework - EF 迁移 : Rollback last applied migration?

entity-framework-4 - 可以从 View 中使用 `System.Data.Objects.SqlClient.SqlFunctions` 吗?

sql-server - 适用于 Azure 的 SQL Server 解析器

sql-server - 为什么在 SQL Server 批量插入期间格式化文件会导致错误?

c# - 如何使用 C# 将二维数组插入数据库

sql - 存储过程: reduce code duplication using temp tables

sql - 从临时表更新

sql-server - SQL Server 2008,我可以在 udf 中的 select 语句中引用临时表吗?