我希望能够在数据库中存储记录过滤条件(基本上是SELECT查询中WHERE之后的内容),并希望稍后在SELECT中使用此条件。该场景是由用户(很少)设置过滤条件,并且在每次检索数据记录时(通常)使用该条件。
过滤条件是一个布尔表达式,例如:(x和y) OR z。x、y和z是可以通过连接表连接到数据记录的关键字。
我可以将表达式存储为text/xml,然后在每次需要检索数据时对其进行解析并动态构造sql查询,但这似乎效率很低。
有没有更好的方法?
发布于 2011-08-05 00:17:57
如果您的列选择是静态的,另一种方法是在查询之外创建一个StoredProcedure,并将StoredProcedure名称存储到某个'QueryMaster‘表中。这样,您就可以将动态查询限制为只使用Exec SP_EXECUTESQL <SP_NAME> <Params>,并为您的主要选择获得编译查询的好处。
你可以使用Avoid Conversions In Execution Plans By Using sp_executesql Instead of Exec。
如果您的列选择也不是静态的,您可能希望创建视图,而不是存储的过程。只有当您的主表很大或使用大量连接时,这可能会更好。
这是假设您有大量可能的过滤条件和少量的实际过滤条件。例如,用户可以过滤100列-但他们可能会创建25-30个这样的组合,并继续使用它。
如果要过滤的列数量有限,更好的方法是使用Case、IsNull、Collace等创建一个通用的where子句。请参阅Implementing Dynamic WHERE-Clause in Static SQL中的一些示例。
发布于 2011-08-04 09:55:56
我有一种感觉,这个问题没有更好的解决方案。您必须将筛选条件( where子句)存储在数据库或文件中的某个位置。无论何时想要执行查询,都必须从文件/db中获取过滤条件的详细信息,并使用一些代码构建查询。
我不认为有任何方法可以绕过这一点-数据库系统没有一个特性可以帮助解决这个问题。
如果这会导致效率问题,您可以在第一次读取过滤器详细信息后将其缓存到某个地方。
https://stackoverflow.com/questions/6935217
复制相似问题