2014-07-09 47 views
0

我正在致力於將調用一個簡單的存儲過程的ASP.NET應用程序。 SP看起來像這樣:傳遞參數,將返回所有行

Select * 
from empTable 
where ID = @ID AND Department = @DeptID 
    and status = @status 
    and role = @role 

ASP.NET應用程序將傳遞一個值給存儲過程中的每個參數。每個參數都可以爲null或有一個值。但是,如果用戶輸入任何內容(空或空),它應該返回empTable中的所有內容,就像Select * from empTable沒有Where子句一樣。

然而,由於從管理的命令:

  1. 我不能改變在ASP.NET應用程序的代碼。
  2. 我不能使用動態SQL。
  3. 我只能修改存儲過程。

有什麼辦法可以解決這個問題嗎?

回答

3

通過更改WHERE子句並指定默認值來使參數可選。

CREATE PROCEDURE MyProc 
    @ID INT = NULL 
AS 
     Select * from empTable where ID = ISNULL(@ID, ID); 
+0

請問你可以向我解釋ID = ISNULL(@ID,ID)的部分;據我的理解,如果x爲null,ISNULL(x,y)將返回值y。但是在這種情況下,我們從不指定ID的值,它如何知道要替換的值是什麼? –

+0

因爲當參數在proc定義中定義時,它被定義爲具有NULL的默認值。如果你沒有通過,它會採用默認值。 –

+0

如果@ID爲NULL,則它將用empTable中的ID替換該值。所以ID = ID或columnX = columnX,它總是爲真,因此它返回所有行。 – JodyT

0

Case語句工作...使用情況設置1 = 1時@id = '所有'(或任何你想要的@id等於所有)

Select * from empTable where 
case when @id = 'all' then 1 else id end 
= 
case when @id = 'all' then 1 else @id 

JodyT的答案是更好的...這個作品,但不是很漂亮