You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在存储过程及C#代码中获取总记录数?附相关代码示例

获取表值参数存储过程的总记录数方案

我来给你梳理下怎么在存储过程和C#代码里拿到你要的总记录数,结合你现有的代码来调整:

一、调整存储过程逻辑

1. 针对带表值参数的存储过程(获取插入行数/表总记录数)

如果你想知道本次通过表值参数插入了多少条记录,用@@ROWCOUNT是最高效的方式,不需要扫描整个表。直接给存储过程加个输出参数就行:

ALTER PROCEDURE [dbo].[TableName] 
    @dt AS dbo.DataTableAsType READONLY,
    @insertedCount INT OUTPUT -- 新增输出参数,返回本次插入行数
AS BEGIN 
    SET NOCOUNT ON; -- 关闭默认的受影响行数提示,避免干扰C#端获取输出参数

    -- 显式写出89个列名(建议不要省略,避免表结构变化出问题)
    INSERT INTO dbo.[DataTableAsType] ([列名1], [列名2], ..., [列名89]) 
    SELECT [列名1], [列名2], ..., [列名89] FROM @dt;

    -- 把本次插入的行数赋值给输出参数
    SET @insertedCount = @@ROWCOUNT;

    -- 如果是要获取DataTableAsType表的总记录数,替换上面的行:
    -- SET @insertedCount = (SELECT COUNT(*) FROM dbo.[DataTableAsType]);
END

2. 优化第二个存储过程的输出逻辑

你的第二个存储过程可以调整得更清晰,确保输出参数正确赋值:

ALTER PROCEDURE [dbo].[YourSecondProcName] -- 记得补全你的存储过程名称
    @totalRecords INT OUTPUT
AS BEGIN
    SET NOCOUNT ON;

    -- 同样建议显式指定列名
    INSERT INTO dbo.tablename1 ([列名1], [列名2], ...) 
    SELECT [列名1], [列名2], ... FROM dbo.tablename2;

    -- 两种选择:
    -- 1. 获取tablename2的总记录数
    SELECT @totalRecords = COUNT(*) FROM dbo.[tableName2];
    -- 2. 获取本次插入到tablename1的行数,用下面这行替换上面的
    -- SET @totalRecords = @@ROWCOUNT;
END

二、C#代码调用获取记录数

1. 调用带表值参数的存储过程

假设你用SqlConnection和SqlCommand来操作,代码示例如下:

using (SqlConnection conn = new SqlConnection("你的数据库连接字符串"))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("dbo.TableName", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        // 1. 配置表值参数
        DataTable yourDataTable = new DataTable(); 
        // 这里要确保yourDataTable的列结构和dbo.DataTableAsType完全匹配(列名、类型、顺序)
        // 假设你已经完成了DataTable的填充逻辑

        SqlParameter tvpParam = cmd.Parameters.AddWithValue("@dt", yourDataTable);
        tvpParam.SqlDbType = SqlDbType.Structured;
        tvpParam.TypeName = "dbo.DataTableAsType"; // 指定用户定义表类型的名称

        // 2. 配置输出参数
        SqlParameter outputParam = new SqlParameter("@insertedCount", SqlDbType.Int);
        outputParam.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(outputParam);

        // 执行存储过程
        cmd.ExecuteNonQuery();

        // 获取结果
        int insertedCount = (int)outputParam.Value;
        Console.WriteLine($"本次成功插入{insertedCount}条记录");
    }
}

2. 调用第二个存储过程获取总记录数

代码逻辑类似,重点是配置输出参数:

using (SqlConnection conn = new SqlConnection("你的数据库连接字符串"))
{
    conn.Open();
    using (SqlCommand cmd = new SqlCommand("dbo.YourSecondProcName", conn))
    {
        cmd.CommandType = CommandType.StoredProcedure;

        // 配置输出参数
        SqlParameter totalRecordsParam = new SqlParameter("@totalRecords", SqlDbType.Int);
        totalRecordsParam.Direction = ParameterDirection.Output;
        cmd.Parameters.Add(totalRecordsParam);

        // 执行存储过程
        cmd.ExecuteNonQuery();

        // 获取总记录数
        int totalRecords = (int)totalRecordsParam.Value;
        Console.WriteLine($"目标表总记录数:{totalRecords}");
    }
}

一些注意点

  • 表值参数对应的DataTable,列结构必须和用户定义表类型dbo.DataTableAsType完全一致,否则会抛出类型不匹配的错误。
  • 用@@ROWCOUNT获取本次操作的受影响行数,比COUNT(*)高效得多,适合只关心本次插入数量的场景。
  • 如果需要统计整个表的总记录数,建议给表建聚集索引(一般主键默认就是聚集索引),这样COUNT(*)的查询速度会非常快。

内容的提问来源于stack exchange,提问作者212Coder

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 11:08:11