您必须“强烈键入”返回集。一种方法,使用 NOT NULL 列声明表变量
Set @A = (select Count(*) From Tasks)
Set @B = (select Count (*) From Tasks)
Set @C = IsNull((@A + @B),0)
--Select @C As UseCount
DECLARE @MyTableVar table(UseCount int NOT NULL)
INSERT @MyTableVar SELECT @C
SELECT TOP(1) UseCount FROM @MyTableVar
也许可以缩短一点。
这会将生成的方法从
public virtual ObjectResult<Nullable<int>> TestProc()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<Nullable<int>>("TestProc");
}
至
public virtual int TestProc()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction("TestProc");
}
抱歉,更正- 虽然生成的方法看起来不错,但它实际上并不起作用。第二个版本是从存储过程返回 RETURN 代码,而不是所需的标量结果。将表变量添加到存储过程中确实会影响实体框架添加函数导入向导的“获取列信息”按钮 - Nullable 列从 true 更改为 false。但是,如果将返回类型设置为 Scalars,则生成的方法仍然使用 Nullable<>。
您可以在 DbContext 的部分类中手动编码该方法,如下所示:
public partial class OnModelCreatingEntities
{
public virtual ObjectResult<int> TestProc2()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<int>("TestProc");
}
}
这给出了正确的结果,并且在重新生成类时不会被覆盖。它也适用于原始的 transact-sql。