我目前有一个对应于业务对象的“过滤器”对象。此对象具有与我希望能够过滤/搜索此类业务对象列表的不同方式有关的属性。目前,这些Filter对象有一个方法,它构建一个where子句的内容,然后将其传递给SQL Server 2000存储过程,并与select查询的其余部分进行联合。然后使用Exec执行最后一个字符串。替代执行动态sql
目前除了我担心与缺乏执行计划缓存的性能问题能正常工作。在一些研究中我看到了使用调用sp_executesql;这是一个更好的解决方案还是有更好的约定为我在做什么?
更新:我认为使用sp_executesql的问题的一部分是基于我的过滤器中的集合,我需要生成一个OR语句列表。我不确定'参数化'查询是否是我的解决方案。
例如
var whereClause = new StringBuilder();
if (Status.Count > 0)
{
whereClause.Append("(");
foreach (OrderStatus item in Status)
{
whereClause.AppendFormat("Orders.Status = {0} OR ", (int)item);
}
whereClause.Remove(whereClause.Length - 4, 3);
whereClause.Append(") AND ");
}
这是不正确的,因为同时当您使用sp_executesql的参数与你计划重用和过程缓存没有得到任何臃肿即席查询将得到不同的计划,每一次。你不会得到转换...如果你有nvarchar列并执行Col ='bla'你会得到一个转换,因为'bla'是varchar – SQLMenace 2009-06-18 13:59:14
我同意你关于调试问题,然而主要的select查询字符串是一个相当简单的列选择和动态部分从负责清理数据并构造sql的对象传递。因此,对于大多数调试问题,我有一个地方可以看看Filter对象中的哪一个。 – jwarzech 2009-06-18 14:02:54
我认为安东意味着说参数化即席查询肯定会得到缓存,并具有类似于存储特效的性能。 – 2009-06-18 14:11:02