2010-08-04 97 views
2

我有一个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似乎“易”的出路,但我不相信这是最好的。有什么想法吗?

回答

1

我认为在.NET端创建SQL语句不仅仅是简单的方法。 SQL在执行set-base操作(例如,运行SELECT语句)时性能最佳。在进行程序编码时,SQL不是最好的选择。

在解决除了在.NET上创建动态SQL之外的每个选项时,您都会要求SQL执行程序性任务。

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

+0

我最终这样做了。保持它的服务器端增加了一点可重用性,但这项工作的价值可以忽略不计。 – 2010-08-25 19:41:48

1

为了在SQL Server中实现这一点,您需要将字符串/ VARCHAR拆分为临时表,然后可以使用该临时表对JOIN进行过滤目标表。

查看这篇关于使用编码输入构建查询的出色MSDN文章。包括拆分字符分隔VARCHAR处理SQL函数:

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

这将很好地工作平等比较 - 操作之间将是棘手的落实。鉴于SQL字符串操作与C#相比的局限性,我最终会在C#中实现这一点。

+0

+1为SQL端,但我最终没有使用这个。例如, – 2010-08-25 19:37:13

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

+1,但我已经提到过这个选项,并知道如何去做。 – 2010-08-25 19:40:49