戻りセットを「厳密に入力」する必要があります。1 つの方法として、列 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");
}
申し訳ありませんが、訂正- 生成されたメソッドは良さそうに見えますが、実際には機能しません。2 番目のバージョンは、必要なスカラー結果ではなく、ストアド プロシージャから RETURN コードを返しています。ストアド プロシージャにテーブル変数を追加すると、Entity Framework Add Function Import ウィザードの [Get Column Information] ボタンに影響があり、Nullable 列が true から false に変わります。ただし、戻り値の型を Scalar に設定すると、生成されたメソッドは引き続き Nullable<> を使用します。
次のように、DbContext の部分クラスでメソッドをハンドコーディングできます。
public partial class OnModelCreatingEntities
{
public virtual ObjectResult<int> TestProc2()
{
return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<int>("TestProc");
}
}
これにより正しい結果が得られ、クラスが再生成されても上書きされません。オリジナルのtransact-sqlでも動作します。