您可以使用
CASE
表达而不是使用
@take
直接变量:
SELECT
*
FROM Properties
-- Some conditions and joins are here using other parameters
-- A big Order by with cases is placed here
OFFSET @skip ROWS
FETCH NEXT CASE WHEN @take > 0 THEN @take ELSE 1000001 END ROWS ONLY;
当然,这需要你为
ELSE
这比您希望查询返回的任何合理结果集都要大。我通常选择一个整数并添加一个,目的是显示最多“整数”结果,如果得到额外的结果,我至少可以包含一个指示器,表明查询返回的结果比这个还要多。
这是基于这样一个假设:用户正在控制过滤,而您希望/能够说“您知道什么,结果太多了”。如果您真的想完成所有这些任务,但我现在不打算向您展示所有这些任务,请使用分页功能”。
我还必须改进上述代码,以允许SP接收一个参数,告诉它是否应按某个字段“分组”。
这是一个更棘手的建议。带有
GROUP BY
子句必须包含
SELECT
包含列的子句
分组依据
条款或
聚合表达式
. (如果没有聚合,分组的意义是什么?)。这与非分组查询有本质的不同,因此您不能使用简单的开关/标志在它们之间进行真正的切换。
此时,查询不太可能有太多的相似性(除了
FROM
您可能希望移到视图或表值函数中以便重用的子句),或者需要切换到动态SQL。