2010-08-13 193 views
1

在我的應用程序中,我有一個有一些過濾字段的表單。如果用戶確實輸入了我需要提供的那些值作爲where子句中的參數,則不需要任何值。帶有非必需參數的SQL存儲過程

我不知道如何在我的存儲過程中處理這個問題。

例如以下存儲過程:

--parameters 
@customername varchar(50), 

SELECT * from ORDERS 
WHERE customername = @customername 

因此,如果用戶輸入客戶名稱那麼當然它會返回所有與該客戶的名字,如果用戶沒有輸入需要返回用戶名一切。 我該如何在本聲明中做到這一點?如果用戶沒有輸入客戶名稱,是否可以通過通配符?或者我需要一個單獨的程序。 我希望這是有道理的,謝謝!

+0

進一步解釋,如果用戶沒有輸入客戶名稱。該過程需要返回包括具有客戶名稱值的所有內容。它只是說用戶不關心我們在看什麼客戶。向我們展示一切。不知道我以前是否明確表示過。謝謝! – twal 2010-08-13 16:16:35

回答

4

試試這個

--parameters 
@customername varchar(50) = NULL, 

SELECT * from ORDERS 
WHERE customername = COALESCE(@customername, customername) 

每你需要返回爲空customernames,這是集成拉斯的評論。

SELECT * from ORDERS 
WHERE (customername = COALESCE(@customername, customername) 
OR customername IS NULL) 
+0

使用您的示例,如果用戶沒有輸入客戶名稱,我會爲@customername參數提供存儲的proc只是一個空值嗎? – twal 2010-08-13 16:19:27

+0

@twal。你可以手動提供一個空值,但是因爲StingyJack的sproc在這裏的參數的默認值爲NULL,你也可以根本不提供這個參數。 – 2010-08-13 16:27:33

+0

oh duh我是個白癡我沒有看到@customername varchar(50)= NULL, – twal 2010-08-13 16:29:05

3
SELECT * from ORDERS 
WHERE customername = @customername or @customername is null 
+0

使用Coalesce或IsNull會更好 – CaffGeek 2010-08-13 16:15:36

+0

@Chad爲什麼?我不是說你錯了,但你有什麼證據?沒有證據的陳述是毫無價值的。 – 2010-08-13 16:29:50

+1

使用其中一個將使未來的維護更容易。從技術上講,它可能會評估爲非常相似的查詢計劃。 – StingyJack 2010-08-13 16:49:32

-1

您可以在存儲過程中編寫if語句。喜歡這個。

IF @customername is null 
BEGIN 
    SELECT * FROM ORDERS 
END 
ELSE 
BEGIN 
    SELECT * FROM ORDERS WHERE customername = @customername 
END 
+0

不好不好,這只是將成爲一個非常雜亂PROC – CaffGeek 2010-08-13 16:15:11

+0

難以維持,而類似於動態SQL。 – StingyJack 2010-08-13 16:15:23

+0

我的例子只有一個WHERE子句,當我寫我的生產存儲過程可能有6或7這可能會導致混亂。謝謝你的回答,但麻煩。 – twal 2010-08-13 16:18:18