2014-09-24 27 views
0

我有一個表'資產'在數據庫中。此表有四個字段(Id,Name,LocationId,CategoryId)。有條件的地方在SQL Server中的參數

我想創建一個存儲過程,它將根據提供的LocationId和CategoryId參數返回資產。

我想使Where子句相對於LocationId是可選的,即如果用戶將LocationId傳遞爲0,那麼我不想對LocationId進行限制,否則我需要對LocationId進行限制。即如果@LocationId爲0,則應返回來自所有位置標識的資產。

如何更改下面的查詢來實現這個

select * from Asset where LocationId = @LocationId and CategoryId = @CategoryId 

任何幫助嗎?

+0

(LocationId = @@ LocationId或@@ LocationId = 0) – Rob 2014-09-24 10:25:28

+0

單一的跡象...所以得了與單'混淆'的 – Rob 2014-09-24 10:26:15

+0

請閱讀Erland Sommarskog的[T-SQL中的動態搜索條件](http://www.sommarskog.se/dyn-search.html) – 2014-09-24 14:46:21

回答

1

你需要做的是在開始時聲明你的變量爲null。

所以@LocationID int = null

然後在你那裏,你會希望把像

WHERE (LocationID = @LocationID or @LocationID IS NULL) 

這樣,如果你沒有通過一個ID子句,一切都將被退回。

編輯 - 因此,這對你的作品,只要通過之ID的可選的,而不是把0的,你當然可以做WHERE (LocationID = @LocationID or @LocationID = 0)

我只是覺得用NULL的是乾淨多了。

完整的查詢:

CREATE PROC 
@LocationID int = 0, 
@CategoryID int = 0 

AS 

SELECT * 

FROM 
Asset 

WHERE 
(LocationID = @LocationID or @LocationID = 0) 
AND 
(ActivityID = @ActivityID or @ActivtyID = 0) 
+0

它沒有返回正確的結果。 – 2014-09-24 10:49:52

+0

我已經爲你寫了完整的查詢。試試看。 – 2014-09-24 14:44:33

-1

您可以在Where子句中使用Case

select * from Asset 
where LocationId = Case When @LocationId=0 then LocationId else @LocationId end 
and CategoryId = @CategoryId 
+0

@Downvoter什麼是我的查詢問題,你可以請指定 – Rajesh 2014-09-24 10:40:35

+0

沒有必要使用一個案例。這是低效的。 – 2014-09-24 14:44:08

+0

@Telexx我曾使用'CASE',因爲在問題** Bilal Ahmed **說如果@LocationId是0,那麼所有位置的記錄將被選中,否則只有特定位置記錄被選中 – Rajesh 2014-09-25 09:10:11