用于空存储过程结果的. fromsql的替代方案



我使用存储过程从SQL Server返回数据。但是,我使用FETCH NEXT来获取数据,这意味着如果没有返回数据,我会得到这个错误:

为FETCH子句提供的行数必须大于零。

因此,我需要将SELECT语句包装在IF语句中,因此只有在返回数据时才调用SELECT:

IF @TotalCount > 0
BEGIN
SELECT
...
OFFSET @SkipResults ROWS
FETCH NEXT @PageSize ROWS ONLY
END

然后使用此命令将数据作为DbSet获取:

var data = await dbContext.MyDataSet.FromSqlRaw("EXECUTE myProcedure @Param1, @Param2", param1, param2).ToListAsync();

其中dbContext.MyDataSet定义为:

DbSet<MyDataModel> MyDataSet { get; set; }

MyDataModel具有以下属性:

public class MyDataModel 
{
public int CompletedPercentage { get; set; }
public string Title { get; set; }
public string Code { get; set; }
}

我遇到的问题是,当@TotalCount在存储过程中为0时,没有数据从存储过程返回。

然后代码抛出一个异常:

要求的列'CompletedPercentage'不存在于'FromSql'操作的结果中。

是否有一种使用存储过程来填充我的DbSet<MyDataModel> MyDataSet属性的替代方法,在返回数据或不返回数据时都有效?

谢谢你的建议,你给我指明了正确的方向。

我已经删除了IF语句,并将检查移到WHERE子句中,因为我希望这将意味着如果@TotalCount = 0

,那么复杂的SELECT语句将不会执行。
SELECT
...
WHERE
@TotalCount > 0
OFFSET @SkipResults ROWS
FETCH NEXT @PageSize ROWS ONLY

我在存储过程中也有一些逻辑,我没有包括在问题中…

IF @PageSize < 1
SET @PageSize = @TotalCount

已更改为

IF @PageSize < 1
SET @PageSize = CASE WHEN @TotalCount > 0 THEN @TotalCount ELSE 1 END

这修复了由FETCH NEXT @PageSize创建的错误,我现在可以得到我需要的空数据集。

相关内容

  • 没有找到相关文章

最新更新