ASP.NET中如何将SQL Server动态PIVOT查询结果填充到DataTable
实现代码(C#版)
首先需要引入对应的命名空间:
using System.Data; using System.Data.SqlClient; using System.Configuration; // 从web.config读取连接字符串时需要引用
核心逻辑代码如下:
// 建议将连接字符串配置在web.config的connectionStrings节点下 string connStr = ConfigurationManager.ConnectionStrings["你的数据库连接节点名称"].ConnectionString; // 你原始的动态SQL,调整为参数化形式避免SQL注入风险 string execSql = @" DECLARE @cols AS NVARCHAR(MAX), @col1 AS NVARCHAR(30), @col2 AS NVARCHAR(30), @query AS NVARCHAR(MAX) SELECT @cols = STUFF((SELECT DISTINCT',' + QUOTENAME(schedule) FROM table1 WHERE value = @inputCol1 GROUP BY schedule FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 1, '') SET @col1 = @inputCol1 SET @col2 = @inputCol2 SET @query = N'SELECT eclo1, ecol2, ecol3, ' + @cols + N' FROM (SELECT eclo1, ecol2, ecol3, ecol4, schedule, material FROM table2 WHERE eval1 = @col1 AND eval2 = @col2) x PIVOT (COUNT(material) FOR schedule IN (' + @cols + N')) p ' EXECUTE(@query) "; DataTable resultDt = new DataTable(); // using语法会自动释放资源,无需手动关闭连接、释放对象 using (SqlConnection conn = new SqlConnection(connStr)) { using (SqlCommand cmd = new SqlCommand(execSql, conn)) { // 给参数赋值,参数类型、长度和数据库字段保持一致即可 cmd.Parameters.Add("@inputCol1", SqlDbType.NVarChar, 30).Value = "value1"; cmd.Parameters.Add("@inputCol2", SqlDbType.NVarChar, 30).Value = "value2"; using (SqlDataAdapter adapter = new SqlDataAdapter(cmd)) { // 直接填充DataTable,适配器会自动处理连接的开闭 adapter.Fill(resultDt); } } } // 此时resultDt已经存储了完整的查询结果,可直接绑定到页面控件或者做后续业务处理
注意事项
- 上述代码补充了子查询中缺失的
material字段,否则PIVOT聚合时会报错,如果你原始SQL已经包含该字段可忽略调整 - 参数化写法适配动态输入的场景,如果
value1、value2来自用户输入,可有效避免SQL注入风险
内容的提问来源于stack exchange,提问作者sonu
相关产品推荐
相关产品推荐

