2010-04-22 59 views
1

我想在我的mssql存儲過程中使用參數在小的和詳細的結果(用於可維護性,性能和網絡負載的原因)之間切換。SQL Server - 如何在2個可能的SELECT語句之間切換

如果參數設置爲1,我得到所有列,否則只有一個或兩個最重要的。 在一個非常有限的方式,它的工作原理是這樣的:

ALTER PROCEDURE [dbo].[GetAllUsers] 
@detail BIT 
AS 
IF @detail = 1 SELECT UserName, Title, UserID FROM Users 
ELSE SELECT Username FROM Users 

但我想使用組合的WHEN子句。 以下是我的嘗試,但這並不奏效。

ALTER PROCEDURE [dbo].[GetAllUsers] 
@detail BIT 
AS 
CASE @detail 
    WHEN 1 THEN SELECT UserName, Title, UserID 
    ELSE SELECT UserName END 
    FROM Users 
    WHERE UserID < 5 

有什麼辦法可以達到這樣的效果嗎?

回答

9

我認爲這是可怕的API設計有一個存儲過程基於輸入變量返回不同的記錄類型。我認爲你應該創建兩個存儲過程,GetAllUsersGetAllUsersWithDetails

5

個人而言,我會使用兩種不同的存儲過程。沒有理由創建一個複雜的實現,只是爲了強制事物適合一個存儲過程。

+0

我也想過這個。所以我想我會把它放在兩個。 其中一個原因是,where子句中的更改會影響小版本和詳細版本。我期望where子句變得很大,沒有這樣的'技巧',我有兩個大的where子句,在2個存儲過程中完全相同。 – Marks 2010-04-22 13:54:56

1

雖然我同意klausbyskov這兩個程序是一個更好的設計,我會盡力回答你的問題 - 我恐怕簡短的回答是沒有

它確實有可能執行兩種不同的select語句(這是你有你的第一個代碼示例中),這取決於一個變量的值,但它無法改變投影內單以這種方式選擇語句。