2011-07-29 39 views
1

嗨,我有一個存儲過程,它將有一個動態子句,這是我的存儲過程的樣子;在存儲過程中編寫動態where子句

SELECT Comment.AddDate,Event.StartTime,Users.Name 
FROM Comment 
JOIN Users on Users.USERS_ID = Comment.UserID 
JOIN Event ON Users.USERS_ID = Event.UserID 

如果我傳遞一個變量@Name,存儲過程應該看起來像這樣;

SELECT Comment.AddDate,Event.StartTime,Users.Name 
FROM Comment 
JOIN Users on Users.USERS_ID = Comment.UserID 
JOIN Event ON Users.USERS_ID = Event.UserID 
WHERE Name = @Name 

但是有這樣的情況,其中我通過在@Name將是空的,這意味着我想要的一切,返回,而不是基於一個特定的名稱。

在某些情況下,我也會通過一個eventid,我該如何去做這件事?

回答

5

可以使用COALESCE功能的where子句中使用任何變量或現有的值,是這樣的:

WHERE Name = COALESCE(NULLIF(@Name, ''), Name) AND EventID = COALESCE(@EventID, EventID)

UPDATE:

我增加了NULLIF函數在COALESCE之內,它表示如果@Name的值是空字符串,則將其視爲NULL,因此允許COALESCE功能正常工作。

+0

試過這種,它沒有工作,問題有時一個@Name將爲空,這意味着一切都應該返回。 – pmillio

+2

這沒有意義。 COALESCE基本上說,如果@Name是NULL,則使用導致Name = Name的當前Name值,該值始終爲true。 – sellmeadog

+0

您可以按照其他用戶的建議嘗試'IS NULL OR'選項;我只是喜歡COALESCE – sellmeadog

3
WHERE (@Name IS NULL OR Name = @Name) 
0

不需要動態SQL,只是嘗試:

SELECT Comment.AddDate,Event.StartTime,Users.Name 
FROM Comment 
JOIN Users on Users.USERS_ID = Comment.UserID 
JOIN Event ON Users.USERS_ID = Event.UserID 
WHERE (@Name IS NULL OR Name = @Name) 
OR (@Id IS NULL OR [email protected]) 

@var IS NULL應短路如果沒有提供它的column = @var斷言,這意味着您可以提供兩個參數來選擇行