【问题标题】:Read multiple values returned by multiple SELECT from a SP从 SP 读取多个 SELECT 返回的多个值
【发布时间】:2023-04-10 17:13:02
【问题描述】:

我有这个 SP(为展览而极度简化)

SELECT colA, colB, colC
INTO #MyTable

select COUNT(*) from #MyTable

在 C# 方面,我有

int total = 0;
var command = _context.CreateStoreCommand(
    "dbo.mySP",
    CommandType.StoredProcedure,
    new SqlParameter("Param1", parameters.Param1),
    //...
);

using (command.Connection.CreateConnectionScope())
{
    using (var reader = command.ExecuteReader())
    {
        result = new Materializer<MyType>()
            .Materialize(reader)
            .ToList();

            if (reader.NextResult() && reader.Read())
            {
                // This returns the total number of elements, 
                // (select COUNT(*) from #MyTable, ~15000 in my case)
                total = reader.GetInt32(0); 
            }
        }
    }

由于 SP 可能会产生大量数据,.Materialize(reader) 仅将 10 个 first 元素返回到 result 变量中。
对于某些人来说,绝对无法更改此规则原因我在这里无法解释。

然而,在上面的示例中,total 是 SP 的结果总数,可能大于 10(在我的情况下约为 15000)并且效果很好。

我现在需要返回另一个结果,比如说

SELECT COUNT(*) from #MyTable WHERE colA = 'sample value'

显然,我不能在 C# 端进行,例如 var x = result.Where(x =&gt; x.Prop = "sample value").Count(),因为它只会搜索前 10 个结果,而 我希望它搜索整个数据集,即 ~ 15000 在这里。

我尝试添加

var total2 = reader.GetInt32(1);

reader.GetInt32(1) 系统性地解雇了System.OutOfRangeException

在 C# 方面,我如何读取我的 SP 上的新 SELECT 语句返回的另一个结果?

【问题讨论】:

    标签: c# sql sqldatareader sqlconnection sqlcommand


    【解决方案1】:

    要接收第三个结果集,您需要再次调用 NextResult

    if (reader.NextResult() && reader.Read())
    {
        total2 = reader.GetInt32(0); 
    }
    

    虽然我会建议您将第二个查询更改为使用条件聚合(一起执行会更高效):

    select COUNT(*), COUNT(CASE WHEN colA = 'sample value' THEN 1 END)
    from #MyTable
    

    然后您可以使用您的原始代码:

    if (reader.NextResult() && reader.Read())
    {
        total = reader.GetInt32(0);
        total2 = reader.GetInt32(1); 
    }
    

    您也可以完全删除临时表,只使用窗口计数

    SELECT colA, colB, colC,
        COUNT(*) OVER (),
        COUNT(CASE WHEN colA = 'sample value' THEN 1 END) OVER ()
    FROM Whatever
    

    您现在将只有一个结果集,其中每一行都有整个结果集的总数。

    【讨论】:

    • 感谢这个解决方案,它太简单了,我没想到。我也会试试你的建议。它在性能方面“效率更高”?
    猜你喜欢
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2010-10-27
    • 2014-10-12
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 2013-02-12
    相关资源
    最近更新 更多