用于搜索的SQL动态查询

时间:2010-05-06 21:27:22

标签: sql dynamic-sql

我正在研究一个我确定曾经见过某个人的问题,但我在网上找到的就是如何不去做。

Fake table example and dynamic searching。 (由于我的评价很低,我无法发布图片。我知道我应该感到羞耻!)

单击“添加”按钮会自动创建另一行以添加更多条件选项。

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

现在我的问题,我以为我知道如何处理这个任务的SQL,但我真的不知道。我应该做的唯一例子不是用于这种动态表查询。这些示例无法像用户那样创建尽可能多的搜索过滤器(或者我的理解可能缺乏)。

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

我真的很好奇这种情况的最佳做法。提前谢谢。

4 个答案:

答案 0 :(得分:1)

我有一个类似的问题。您可以将动态sql与sp_executesql存储过程一起使用,您可以将select语句实际构建为字符串并将其传入。

或者您可以编写存储过程类似于我创建的那个,其中您具有where子句中的所有条件,但忽略NULL值。

这是我为我的场景提出的存储过程: How do I avoid dynamic SQL when using an undetermined number of parameters?

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

答案 1 :(得分:0)

两个主要选择:

Linq to Sql允许您撰写查询,添加它,再次添加它,并且在迭代结果之前它不会实际编译和执行SQL语句。

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

答案 2 :(得分:0)

查看SqlBuilder,一个动态SQL实用程序。

答案 3 :(得分:0)

原帖: Write a sql for searching with multiple conditions

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