我正在开发一个现有的ASP.NET应用程序。当前的应用程序使用了大量的内联查询。现在,他们只想将所有查询重写到存储过程中。
我的问题是,这些查询非常“动态”,查询会根据不同的if...else
条件进行连接,例如:
string query = "Select * from EmpTable WHERE EmpType ='ACTIVE'";
if (conditionA == true)
query += "AND ID = 12345 ";
if (conditionB == true)
query += "AND Dept = 'Finance' ";
else
query += "AND Dept <> 'Finance' ";
if (conditionC == true)
query += "Order by EmpID";
else if (ConditionD == true)
query += "Order by Dept";
他们还希望避免使用动态查询。我有什么选择?
编辑:我知道我也可以使用存储过程构建动态查询,我只是想知道那里有什么其他“减少痛苦”选项。
答案 0 :(得分:3)
传入您可能需要的所有参数,并使用IsNull和/或When子句创建与原始程序中相同的查询。
或者,您可以简单地在sproc本身中动态构建查询,或者只是为每个排列创建一个查询。不一定很有趣,或者很聪明,但是可以在将来更容易维护 - 特别是当你可以将它作为未来重构sprocs的垫脚石时。
编辑:还有一个原因可以简单地将它们全部转换为sprocs - 当未来的开发人员出现并希望添加一些SQL时,他们将遵循约定并自己创建一个新的sproc。我想象一下你的代码充斥着动态SQL的一个原因是因为它已经充斥着动态SQL。也许随着时间的推移,你可以改进它们(slap 遗留,必须修复在每个转换的顶部),你也可以让它们自己修复设计。