代码之家  ›  专栏  ›  技术社区  ›  Nelson Rothermel

搜索列表,范围

  •  2
  • Nelson Rothermel  · 技术社区  · 15 年前

    我有一个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发送到存储过程。

    我考虑过一些并非相互排斥的选择:

    1. 我可以按原样发送字符串。根本没有 array[] = SPLIT(',', @query) 或者类似的,所以解析是低级的。我宁愿在.NET端进行解析。
    2. 在.NET端,转换为XML,在SP convert to table中。
    3. 使用光标遍历表中已有的参数,执行单独的查询,并合并结果。
    4. 创建一个动态where子句(在带有#1的SQL端,或在.NET端)

    3 回复  |  直到 15 年前
        1
  •  1
  •   bobs    15 年前

    在处理除在.NET端创建动态SQL之外的每个选项时,您要求SQL执行过程性的操作。

        2
  •  2
  •   Mikael Svenson    15 年前

    在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();
    
        3
  •  1
  •   leepowers    15 年前

    为了在SQLServer中实现这一点,您需要将字符串/VARCHAR拆分成一个临时表,然后该临时表可以用于连接以过滤目标表。

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

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

    这对于相等性比较非常有效—操作之间的比较将更难实现。考虑到SQL字符串操作与C#相比的局限性,我最终将在C#中实现它。