C# Windows应用中动态生成多OR条件SQL WHERE子句的方法
实现动态生成多组(Name = @name AND Account = @account) OR条件的SQL查询
下面提供两种可靠的实现方式,兼顾安全性和实用性:
方法1:使用表值参数(推荐方案)
这种方式是SQL Server推荐的批量参数化查询方案,完全避免SQL注入,性能表现也更优,适合批量数据场景。
步骤1:在SQL Server中创建用户定义表类型
CREATE TYPE dbo.NameAccountPair AS TABLE ( Name NVARCHAR(100), -- 字段类型和长度匹配你的数据表 Account NVARCHAR(100) );
步骤2:C#代码中构造参数并执行查询
// 模拟需要匹配的Name和Account组合 var targetPairs = new List<(string Name, string Account)> { ("张三", "zhangsan001"), ("李四", "lisi002") }; // 转换为符合表类型结构的DataTable var tvpData = new DataTable(); tvpData.Columns.Add("Name", typeof(string)); tvpData.Columns.Add("Account", typeof(string)); foreach (var pair in targetPairs) { tvpData.Rows.Add(pair.Name, pair.Account); } // 编写查询语句 var sqlQuery = @" SELECT * FROM YourTargetTable WHERE EXISTS ( SELECT 1 FROM @MatchPairs p WHERE p.Name = YourTargetTable.Name AND p.Account = YourTargetTable.Account )"; // 执行查询 using (var connection = new SqlConnection("你的数据库连接字符串")) { connection.Open(); using (var command = new SqlCommand(sqlQuery, connection)) { // 添加表值参数 var tvpParam = command.Parameters.Add("@MatchPairs", SqlDbType.Structured); tvpParam.Value = tvpData; tvpParam.TypeName = "dbo.NameAccountPair"; // 对应创建的表类型名称 // 读取并处理结果 using (var reader = command.ExecuteReader()) { while (reader.Read()) { // 处理每行数据 } } } }
方法2:安全的动态SQL拼接(适合小批量数据)
如果不想创建表类型,可以用参数化的动态拼接方式,核心是绝对不能直接拼接字符串值,必须为每个条件组创建独立参数。
var targetPairs = new List<(string Name, string Account)> { ("张三", "zhangsan001"), ("李四", "lisi002") }; var conditionClauses = new List<string>(); var sqlParameters = new List<SqlParameter>(); // 循环生成条件和对应参数 for (int i = 0; i < targetPairs.Count; i++) { var nameParam = $"@name_{i}"; var accountParam = $"@account_{i}"; conditionClauses.Add($"(Name = {nameParam} AND Account = {accountParam})"); sqlParameters.Add(new SqlParameter(nameParam, targetPairs[i].Name)); sqlParameters.Add(new SqlParameter(accountParam, targetPairs[i].Account)); } // 拼接完整SQL语句 var whereClause = string.Join(" OR ", conditionClauses); var sqlQuery = $"SELECT * FROM YourTargetTable WHERE {whereClause}"; // 执行查询 using (var connection = new SqlConnection("你的数据库连接字符串")) { connection.Open(); using (var command = new SqlCommand(sqlQuery, connection)) { command.Parameters.AddRange(sqlParameters.ToArray()); using (var reader = command.ExecuteReader()) { while (reader.Read()) { // 处理每行数据 } } } }
注意:这种方式受限于SQL Server的参数数量上限(默认2100个),所以只适合小批量数据的场景。
内容的提问来源于stack exchange,提问作者Developer
相关产品推荐
相关产品推荐

