如何在存储过程及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
相关产品推荐
相关产品推荐

