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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:15:41