2015-07-11 34 views
1

我有一個數字,都使用相同的WHERE條款,例如查詢:常見的WHERE子句跨越多個存儲過程

--Query1 
CREATE PROC Query1 
    @Param int 
AS 
BEGIN 
    SELECT 
     field2, 
     COUNT(field2) 

    FROM 
     some_table 

    WHERE 
     field1 = condition1 
     AND field2 = @Param 

    GROUP BY 
     field1 
END 

--Query2 
CREATE PROC Query2 
    @Param int 
AS 
BEGIN 
    SELECT 
     field2, 
     COUNT(field2) 

    FROM 
     some_table 

    WHERE 
     field1 = condition1 
     AND field2 = @Param 

    GROUP BY 
     field2 
END 

我想知道如果我可以創建一個函數或某種,我可以使用通過查詢來防止重複代碼和更好的可維護性?

+0

這些查詢是相同的,你的問題就沒有意義了 – mikeb

+0

我已經修訂,以提高查詢不同。問題背後的目的是關於在查詢中使用的常見的WHERE子句。 – Gareth

回答

2

你會使用值函數內嵌表此

CREATE FUNCTION dbo.some_function 
( 
    @Param INT 
) 
RETURNS TABLE 
AS 
RETURN 
(
     SELECT * 
     FROM some_table 
     WHERE field1 = condition1 
      AND field2 = @Param 
) 

那麼你的程序將使用

SELECT field1, 
     COUNT(field1) 
FROM dbo.some_function(@Param) 
GROUP BY field1 

SELECT field2, 
     COUNT(field2) 
FROM dbo.some_function(@Param) 
GROUP BY field2 

如果在函數定義中使用*你必須記得刷新它,如果基礎表定義用sp_refreshsqlmodule更改以避免奇怪的結果,所以出於這個原因,明確列出列可能會更好。

+0

謝謝馬丁。從經驗來看,與僅僅選擇所有數據和刷新表定義相比,您覺得在維護函數中的選定字段方面有多困難?如果我要採用選擇所有數據的方法,那麼需要刷新表格定義的頻率如何? – Gareth

+0

@Gareth - 如果您在基礎表中添加或刪除列,則只需刷新該函數。如果你在SSDT中進行開發,那麼部署腳本已經考慮到了這一點。否則,我建議明確列出列而不是'*',因爲如果你忘記了,它不會最終默默地做錯誤的事情。 –

+0

再次感謝馬丁。當我回來時,會放棄這一點。 – Gareth

-1

你可以創建一個視圖來運行查詢,你有同樣的問題刷新。如果使用select *創建視圖,則在創建視圖時,使用與*匹配的列創建視圖。

CREATE_VIEW func_view AS 
SELECT * 
     FROM some_table 
     WHERE field1 = condition1 

然後,運行您的選擇像select * from func_view group WHERE field2 = @Param

+0

視圖有同樣的問題 - 因此存在'sp_refreshview' - 並且不能被參數化。 –

+0

對,我編輯,以表明我的意思是把查詢的靜態部分放在視圖中。另外,我誤解了你關於刷新的東西,當你使用'select *'創建視圖和函數時,它會用你創建它時的任何*手段創建它。 – mikeb