2013-06-13 80 views
0

需要编写一个过程来检索数据,如果用户没有输入值,某些选择标准未被采纳到过程中。我过滤:存储过程过滤

WHERE @ts = [ts] or @username = [username] 
or @ip = [ip] or @my_category = [my_category] 
or @my_name = [my_name] or @nm1_name = [nm1_name] 
or @param = [param] or @short_descr = [short_descr] 

当我调用存储过程,并通过其中的一个参数时过滤的作品,当我写了一些,只有一个过滤工作(因为我有我的逻辑“或”)。取而代之的是'和'不必要的不​​必要的必须通过所有的参数,我只需要传输我想过滤掉的那些参数。请帮我解决这个问题

+0

林不知道你想做什么。你的意思是你想根据传入的参数来做不同的过滤器吗? –

回答

3

当你不使用相关的过滤器时,你将参数设置为NULL,对吗?在这种情况下

WHERE isnull(@ts, [ts]) = [ts] 
and isnull(@username, [username]) = [username] 
and isnull(@ip, [ip]) = [ip] 
and isnull(@my_category, [my_category]) = [my_category] 
and isnull(@my_name, [my_name]) = [my_name] 
and isnull(@nm1_name, [nm1_name]) = [nm1_name] 
and isnull(@param, [param]) = [param] 
and isnull(@short_descr, [short_descr]) = [short_descr] 
option (recompile) 

我提倡用选项(重新编译)

编辑:

所以,你可以使用这样的查询

与 '',而不是NULL

WHERE @ts in ('', [ts]) 
and @username in ('', [username]) 
and @ip in ('', [ip]) 
and @my_category in ('', [my_category]) 
and @my_name in ('', [my_name]) 
and @nm1_name in ('', [nm1_name]) 
and @param in ('', [param]) 
and @short_descr in ('', [short_descr]) 

(不是使用或每一次更具可读性和它不需要重新编译*)

(*)作为参数不会反正嗅

+0

为了标记这一点,我建议@GeoVIP看一看http://www.sommarskog.se/dyn-search-2008.html中的各种方法,并且写得很好。 – Meff

+0

@Serge,谢谢你的回答,但是当我像你的代码一样过滤它没有工作。我执行如下程序:exec myProc'','Tom','','Tom','','','','' – GeoVIP

+0

嗯,你总是可以使用NULLIF。 WHERE isnull(nullfi(@ts,''),[ts])= [ts]。 – Serge

4
WHERE (@ts IS NULL OR [ts] = @ts) 
and (@username IS NULL OR [username] = @username) 
and (@ip IS NULL OR [ip] = @ip) 
and (@my_category IS NULL OR [my_category] = @my_category) 
and (@my_name IS NULL OR [my_name] = @my_name) 
and (@nm1_name IS NULL OR [nm1_name] = @nm1_name) 
and (@param IS NULL OR [param] = @param) 
and (@short_descr IS NULL OR [short_descr] = @short_descr) 

编辑:

我在其他答案的评论中,您看到的是传递空白字符串而不是NULL。在这种情况下,你需要处理它们(或除此之外)为空

WHERE (@ts IS NULL OR @ts = '' OR [ts] = @ts) 
and (@username IS NULL OR @username = '' OR [username] = @username) 
and (@ip IS NULL OR @ip = '' OR [ip] = @ip) 
and (@my_category IS NULL OR @my_category = '' OR [my_category] = @my_category) 
and (@my_name IS NULL OR @my_name = '' OR [my_name] = @my_name) 
and (@nm1_name IS NULL OR @nm1_name = '' OR [nm1_name] = @nm1_name) 
and (@param IS NULL OR @param = '' OR [param] = @param) 
and (@short_descr IS NULL OR @short_descr = '' OR [short_descr] = @short_descr) 
+0

我有一个错误在一个上下文中指定的非布尔类型的表达式, ”。 – GeoVIP

+0

有一个错字,一个'IS NULL'丢失了'@ ip' - 修正了 –

+0

非常感谢您的帮助。 IT WORKS – GeoVIP