Joe*_*aus 37 stored-procedures entity-framework temp-tables
假设如下:
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
Run Code Online (Sandbox Code Playgroud)
当我生成函数导入或映射返回类型时,EF不会生成复杂类型或告诉我:
选定的存储过程或函数不返回任何列
怎么克服这个?
其他答案建议使用表变量(由于性能原因不会这样做)伪造返回模式并注释掉实际存储过程,其他建议与视图类似 ...但必须有一种方法来做到这一点,而不必添加不必要的开销或要求我打破存储过程来更新模型?
小智 61
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
Run Code Online (Sandbox Code Playgroud)
为结果集提供虚假数据合同是解决问题的最简单,最干净,最快捷的方法.SSIS中的数据源控件也存在同样的问题..NET将从查询的无法访问的"合同"部分读取结果集,并提供复杂类型的元数据.没有性能影响,也没有必要注释掉执行实际工作的SQL.
Rom*_*rai 47
将其添加到存储过程定义的顶部:
SET FMTONLY OFFRun Code Online (Sandbox Code Playgroud)允许模型从临时表中推断出架构而没有问题.作为奖励,它不需要对合同进行额外维护.
例:
SET FMTONLY OFF
CREATE TABLE #tempTable (
...
)
...
SELECT * FROM #tempTable
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
23725 次 |
| 最近记录: |