簡體   English   中英

sql 服務器如何在具有不同返回結果的多個查詢中重用 where 條件

[英]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

如果它與你有關,你可以用我能想到的兩種方式來做

我沒有測試,但查詢會是這樣的:

  1. 使用存儲過程:創建帶參數的存儲過程,查詢時將存儲過程存儲在臨時表中並與其他表連接

  2. 創建一個參數化的 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM