我希望能够在数据库中存储记录过滤条件(基本上是在SELECT查询中的WHERE之后),并且我希望稍后在SELECT中使用此条件。场景是用户设置过滤器标准(很少),并且每次检索数据记录时都会使用此标准(通常)。
过滤条件是布尔表达式,例如:(x AND y)OR z。 x,y和z是可以通过联结表连接到数据记录的关键字。
我可以将表达式存储为text / xml,然后解析它并在每次要检索数据时动态构造一个sql查询,但这似乎效率低下。
有更好的方法吗?
答案 0 :(得分:2)
如果列选择是静态的,则替代方法可能是从该查询中创建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子句,那么要使用有限数量的列进行过滤,请参阅{{3举几个例子。
答案 1 :(得分:0)
我觉得这个问题没有更好的解决办法。您必须将过滤条件(where子句)存储在数据库或文件中的某个位置。每当您想要执行查询时,您都必须从文件/ db获取过滤条件详细信息,并使用某些代码构建查询。
我认为没有办法解决这个问题 - 数据库系统没有可以帮助解决此问题的功能。
如果它导致效率问题,您可以在第一次阅读后将缓存细节缓存到某处。