EF无法从#temp表中select从存储过程select返回模式
假设如下:
CREATE PROCEDURE [MySPROC] AS BEGIN CREATE TABLE #tempSubset( [MyPrimaryKey] [bigint] NOT NULL, [OtherColumn] [int] NOT NULL) INSERT INTO #tempSubset (MyPrimaryKey, OtherColumn) SELECT SomePrimaryKey, SomeColumn FROM SomeHugeTable WHERE LimitingCondition = true SELECT MyPrimaryKey, OtherColumn FROM #tempSubset WHERE SomeExpensiveCondition = true END
当我生成一个函数导入或映射返回types时,EF不会生成一个复杂types或告诉我:
所选的存储过程或函数不返回任何列
如何克服这一点?
其他答案build议使用表variables (不会这样做是出于性能原因) 伪造返回模式和注释掉真正的存储过程 ,其他build议做类似的意见 …但必须有一种方法来做到这一点,而不必添加不必要的开销或要求我打破存储过程来更新模型?
CREATE PROCEDURE [MySPROC] AS BEGIN --supplying a data contract IF 1 = 2 BEGIN SELECT cast(null as bigint) as MyPrimaryKey, cast(null as int) as OtherColumn WHERE 1 = 2 END CREATE TABLE #tempSubset( [MyPrimaryKey] [bigint] NOT NULL, [OtherColumn] [int] NOT NULL) INSERT INTO #tempSubset (MyPrimaryKey, OtherColumn) SELECT SomePrimaryKey, SomeColumn FROM SomeHugeTable WHERE LimitingCondition = true SELECT MyPrimaryKey, OtherColumn FROM #tempSubset WHERE SomeExpensiveCondition = true END
为结果集提供人造数据合同是处理问题的最简单,最干净和最快捷的方式。 SSIS中的数据源控件也存在同样的问题。 .NET将从查询的不可达“合同”部分读取结果集并提供复杂types的元数据。 没有性能影响,也没有必要注释掉实际工作的SQL。
将此添加到存储过程定义的顶部:
SET FMTONLY OFF
允许模型从临时表中推断模式,而不会出现问题。 作为奖励,它不需要额外的维护合同。
例:
SET FMTONLY OFF CREATE TABLE #tempTable ( ... ) ... SELECT * FROM #tempTable
解决scheme1使用表variables而不是临时表。
解决scheme2closures设置FMTONLY; SQL命令,您将获得列信息以创build新的复杂types。
解决scheme3这不是一个好方法,但这是一个非常简单的方法。 只要添加一个带有哑元数据的select语句,它将不会执行,因为1 = 0。
你可以查看这个链接的细节