在存储过程中编写动态where子句

时间:2011-07-29 20:05:45

标签: sql stored-procedures

您好我有一个存储过程,它将有一个动态子句,这就是我的存储过程的样子;

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将为空,这意味着我希望返回所有内容而不是基于特定名称。

同样在某些情况下,我也会传递一个偶数,我该怎么做呢?

3 个答案:

答案 0 :(得分:5)

您可以在where子句中使用COALESCE函数来使用变量或现有值,例如:

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

<强>更新

我在NULLIF中添加了COALESCE函数,该函数表示如果@Name的值为空字符串,则将其视为NULL,从而允许COALESCE函数正常工作。

答案 1 :(得分:3)

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

答案 2 :(得分: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 Id=@Id) 

如果@var IS NULL谓词未提供,则column = @var应该短路{{1}}谓词,这意味着您可以提供任一参数来选择行