c# - 搜索列表、范围

标签 c# sql-server

我有一个 ASP.NET 应用程序,需要使用列表和范围搜索 VARCHAR(20) 列。换句话说,输入可能类似于:

ABC,444,CD-EF,90-BA,HIJ

结果必须等于:

SELECT * FROM table
WHERE
  Col1 = 'ABC' OR
  Col1 = '444' OR
  Col1 BETWEEN 'CD' AND 'EF' OR
  Col1 BETWEEN '90' AND 'BA' OR
  Col1 = 'HIJ'

常规 SQL 列排序顺序对于范围来说是可以接受的。这里涉及两个主要部分:

  1. 将参数从 .NET 发送到存储过程。
  2. 使用 SP 中的参数进行搜索。

我考虑过的一些选项并不相互排斥:

  1. 我可以按原样发送字符串。没有 array[] = SPLIT(',', @query) 或类似的,因此解析将是低级别的。我宁愿在 .NET 端进行解析。
  2. 在.NET端,转换为XML,在SP中转换为表。
  3. 使用游标浏览表中已有的参数、执行单独的查询并合并结果。
  4. 创建动态 where 子句(在 SQL 端使用 #1,或在 .NET 端)

.NET 端的动态 SQL 似乎是“简单”的出路,但我不相信它是最好的。有什么想法吗?

最佳答案

如何在 C# 中创建 SQL 语句?这意味着您可以控制输入字符串,这样就不容易受到 SQL 注入(inject)攻击。

string para = "ABC,444,CD-EF,90-BA,HIJ";
StringBuilder sb = new StringBuilder("SELECT * FROM table WHERE ");
List<string> queries = new List<string>();
foreach (var part in para.Split(','))
{
    if (part.Contains("-"))
    {
        var between = part.Split('-');
        queries.Add(string.Format("Col1 BETWEEN '{0}' AND '{1}'", between[0], between[1]));
    }
    else
    {
        queries.Add(string.Format("Col1 = '{0}'", part));
    }
}
sb.Append(string.Join(" OR ", queries.ToArray()));
string sql = sb.ToString();

关于c# - 搜索列表、范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3408332/

相关文章:

c# - Console.WriteLine 慢

sql-server - 用于 SSRS 中的多对多关系的 SQL 数据透视表

sql-server - TSQL 将用户映射到数据库

c# - 尝试连接 MySQL 数据库时 Mono 抛出异常

c# - 为什么 Urlmon.dll 的 FindMimeFromData 函数会为许多文件类型返回 MIME 类型 “application/octet-stream”?

sql - 使用 SQL 拆分 URL 并添加到数据库

mysql - SQL Server DateDiff() 与 MySQL TimestampDiff()

mysql - 对于 SQL 递归 CTE,为什么它每次 'loops' 时不再次引用 anchor 成员?为什么主播成员只得到一次 'called'?

c# - 当服务器返回 401 响应时,请求的资源上不存在 'Access-Control-Allow-Origin' header

c# - 在 DB 中自动聚合数据的最佳方法