搜索列表,范围

时间:2010-08-04 17:58:32

标签: 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中的参数进行搜索。
  3. 我考虑过的一些选项,它们并不相互排斥:

    1. 我可以按原样发送字符串。没有array[] = SPLIT(',', @query)或类似,因此解析将是低级别。我宁愿在.NET端进行解析。
    2. 在.NET端,转换为XML,在SP中转换为表。
    3. 使用游标浏览表中已有的参数,执行单独的查询并合并结果。
    4. 创建动态where子句(在SQL端使用#1,或在.NET端)
    5. .NET方面的动态SQL似乎是“简单”的出路,但我不相信它是最好的。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

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

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();

答案 1 :(得分:1)

我认为在.NET端创建SQL语句不仅仅是简单的方法。 SQL在执行基于集合的操作(例如,运行SELECT语句)时表现最佳。在进行过程编码时,SQL不是最佳选择。

除了在.NET端创建动态SQL之外,在解决每个选项时,您要求SQL执行过程。

既然你可以让.NET做程序性的东西而SQL Server做基于集合的东西,这就是你要走的路。

答案 2 :(得分:1)

要在SQL Server中完成此操作,您需要将字符串/ VARCHAR拆分为临时表的方法,然后可以使用JOIN来过滤目标表。

请参阅这篇关于使用编码输入构建查询的优秀MSDN文章。包含用于拆分以字符分隔的VARCHAR的SQL函数:

http://code.msdn.microsoft.com/SQLExamples/Wiki/View.aspx?title=StringArrayInput&referringTitle=Home

这对于平等比较非常有效 - BETWEEN操作实现起来会更加棘手。鉴于与C#相比SQL字符串操作的限制,我最终会在C#中实现它。