SQL动态查询用于搜索

4

我正在解决一个问题,我相信肯定有人遇到过类似的情况,但我在网上找到的都是如何不做这件事。

虚拟表格例子和动态搜索。(由于我的等级较低,我无法发布图片。我知道应该感到羞愧!!)

点击添加按钮会自动创建另一行以添加更多选择条件。

(注意:我的表格肯定更为复杂)

现在来说我的问题,我原以为自己知道如何处理这个任务的SQL,但其实并不懂。所有的示例都不适用于此种动态表格查询。这些示例没有能力创建像用户所需的那么多搜索过滤器(或者也许是我理解不够)。

如果我上传的图像质量不够好,或者我没有提供足够的信息,请告诉我。

我真的很想知道这种情况下的最佳实践。谢谢您的帮助。


针对哪个数据库(包括版本)? - OMG Ponies
它是在SQL Server 2005中。有帮助吗? - JGood
你可能想阅读 http://www.sommarskog.se/dynamic_sql.html 和 http://www.sommarskog.se/dyn-search.html。 - HLGEM
@HLGEM:非常感谢。这个问题很旧了,但我很感激您发布的资源,并且将不得不仔细研究它。它非常详细,我对此感到兴奋。我非常清楚当时我最终做了什么,基本上是创建一个实体框架,将字符串等混合在一起(不用担心没有SQL注入),但我为离开后必须处理它的人感到遗憾。 - JGood
@goodwince,这些年我已经多次参考了这些文章。他确实是如何安全地执行动态SQL的权威。 - HLGEM
4个回答

1

我有一个类似的问题。您可以使用sp_executesql存储过程中的动态SQL,实际上将选择语句构建为字符串并传递进去。

或者您可以编写一个存储过程,就像我创建的那个一样,在where子句中具有所有条件,但是NULL值被忽略。

这是我为我的情况想出来的存储过程:如何在使用不确定数量的参数时避免动态SQL?

我编写的参数化存储过程的优点是,我能够避免与动态SQL相关的SQL注入风险。


哇..非常详细的帖子。我被分配了另一个任务,所以我必须回到实际的实现上。看起来这种情况并没有一种适合所有的解决方案。我需要基于可能性进行多表搜索的动态能力,否则我也会选择SPROC。我将参数化所有的查询,以避免SQL注入的风险。感谢您的提醒。我真的很喜欢阅读您的帖子。我会告诉您结果如何。 - JGood

0

原始帖子: 编写一个带有多个条件的 SQL 搜索

select * from thetable
where (@name='' or [name]=@name) and (@age=0 or age=@age)

然而,上述查询强制进行表扫描。为了获得更好的性能和更复杂的场景(我猜你在原始帖子中简化了问题),考虑使用动态SQL。顺便说一句,Linq to SQL可以帮助您轻松构建动态SQL,如下所示:

IQueryable<Person> persons = db.Persons;
if (!string.IsNullOrEmpty(name)) persons = persons.Where(p=>p.Name==name);
if (age != 0) persons = persons.Where(p=>p.Age=age);

0

两个主要选择:

Linq to Sql 允许您组成一个查询,添加到它,再次添加到它,直到您迭代结果才会实际编译和执行 SQL 语句。

或者您可以使用动态 SQL。使其变得简单的技巧是使用“WHERE (1=1)”技术,但您必须小心使用参数(避免 SQL 注入攻击)并仔细构建您的 SQL 语句。


你的第二个语句是我的当前方法。我目前正在使用对可能或不可能需要的表进行外连接,并制作一个where类,以搜索这些表以查看是否存在匹配ID。问题在于,我需要单独的AND/OR/NOT能够解析这些连接表的多行,并且它无法找到多行。 我本来想切换到使用'IN',但每个人似乎都认为使用带有IN的动态SQL是不好的做法。 - JGood

0

看看SqlBuilder,一个用于动态SQL的实用工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接