我有一个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列排序顺序。这里涉及两个主要部分:
我考虑过的一些选项,它们并不相互排斥:
array[] = SPLIT(',', @query)
或类似,因此解析将是低级别。我宁愿在.NET端进行解析。.NET方面的动态SQL似乎是“简单”的出路,但我不相信它是最好的。有什么想法吗?
答案 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#中实现它。