[英]sql server how to reuse where conditions in multiple queries with different returning results
我有一个巨大的 sql 查询,其中包含多个连接和捆绑的 where 条件(过滤器)。 查询返回分页或分页结果。 现在在其他情况下,我只需要一个总计数作为结果,而不是基于相同应用过滤器的记录列表。 一种方法是重复/复制相同的查询并更改SELECT
子句并删除分页OFFSET @PageSize * (@PageIndex - 1) ROWS FETCH NEXT @PageSize ROWS ONLY
并且所有 WHERE 条件都将重复,所以将来如果有任何更改我都必须更改两个查询。 有什么办法可以重用所有 WHERE 条件,因为只有选择被更改?
第一个查询:
SELECT Id,Name
FROM Users
WHERE 1=1
...bundle of where conditions
ORDER BY Name
OFFSET @PageSize * (@PageIndex - 1) ROWS FETCH NEXT @PageSize ROWS ONLY
第二个查询:
SELECT COUNT(1)
FROM Users
WHERE 1=1
...reuse above bundle of where conditions
想到两个选项 spring。
动态 SQL 在这里是您的朋友,但使用视图的更实用的设计将允许您集中 where 子句....
如果您需要调整 WHERE 子句,您只需更改视图实现,这将允许在使用视图的任何地方级联更新。
Create View vwCustomUsers
SELECT Id,Name
FROM Users
WHERE 1=1
...bundle of where conditions
SELECT Id,Name
FROM vwCustomUsers
WHERE 1=1
ORDER BY Name
OFFSET @PageSize * (@PageIndex - 1) ROWS FETCH NEXT @PageSize ROWS ONLY
SELECT COUNT(1)
FROM vwCustomUsers
WHERE 1=1
如果它与你有关,你可以用我能想到的两种方式来做
我没有测试,但查询会是这样的:
使用存储过程:创建带参数的存储过程,查询时将存储过程存储在临时表中并与其他表连接
创建一个参数化的 function,您可以与其他表cross apply
。
1. 用于存储过程
假设我们的存储过程名称是SelectFilteredUsers
。
CREATE PROCEDURE SelectUsersWithFilter @param1 @param2
AS
SELECT * FROM Users WHERE --- --- ---
GO;
稍后的查询将是
INSERT INTO #Temp
EXEC SelectFilteredUsers(@param1, @param2)
SELECT Id,Name
FROM #Temp
WHERE 1=1
ORDER BY Name
OFFSET @PageSize * (@PageIndex - 1) ROWS FETCH NEXT @PageSize ROWS ONLY
2.具有功能
CREATE FUNCTION dbo.SelectUsersWithFilter (@params)
RETURNS @retFindReports TABLE .....
你可以这样做
SELECT Id,Name
FROM dbo.fn_MarketDataDetails (@params)
ORDER BY Name
OFFSET @PageSize * (@PageIndex - 1) ROWS FETCH NEXT @PageSize ROWS ONLY
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.