回答

收藏

在存储过程中构建动态WHERE子句

技术问答 技术问答 242 人阅读 | 0 人回复 | 2023-09-14

我正在使用SQL Server 20084 t& _  P1 p+ p/ d3 |/ u* i9 q9 j* R
Express,并且具有一个存储过程,该存储过程SELECT基于参数执行from表。我有nvarchar参数和int参数。
1 Y. K! b# B7 F2 G' T$ j& c$ ~这是我的问题,我的where子句如下所示:- d$ t- }' ]. f6 }# a, e
WHERE [companies_SimpleList].[Description] Like @What
. F( @- s- P& L' m# f1 s) R" K" P    AND companies_SimpleList.Keywords Like @Keywords: d# P# W7 U/ E) d# T! j
    AND companies_SimpleList.FullAdress Like @Where
# }" o2 v  T0 D* s9 C1 Z; N- ^    AND companies_SimpleList.ActivityId = @ActivityId0 G9 H$ }8 o& W2 t0 t4 a* J
    AND companies_SimpleList.DepartementId = @DepartementId4 B! [' B7 ?1 ~  a. s1 ~
    AND companies_SimpleList.CityId = @CityId! t& I; c/ }5 B; ^# G
此参数是我的ASP.NET MVC
: F* G0 H# X2 O7 l! j3应用程序的用户设置的筛选器值,并且int可能未设置参数,因此它们的值将为0。这是我的问题,存储过程将搜索具有0asCityId值的项例如,为此,它将返回错误的结果。因此,基于int参数的值是否大于0,能够有一个动态的where子句会很好。
- G5 k% _& k6 a7 f2 W0 [: ]提前致谢
8 N6 J/ d% G8 J0 Q: u! x                , v& ]- X% z+ l3 g$ a
解决方案:
" T  y+ X) `, p, O" P                $ T# \- h. Z6 |
7 a# x$ `8 V2 f' |1 u8 F
" u. E9 o2 }) v; M$ Q
                尝试以下方法:
5 M) u( z# ^8 P5 W( w" |WHERE 1 = 19 Q* ?+ A7 |% ^7 }8 B9 v
AND (@what     IS NULL OR [companies_SimpleList].[Description] Like @What )( y5 n3 c* i. q- U
AND (@keywords IS NULL OR companies_SimpleList.Keywords        Like @Keywords)% x: q2 h- V4 I2 o5 W2 n0 W
AND (@where    IS NULL OR companies_SimpleList.FullAdress      Like @Where)4 p) H; a: J/ k) u5 i0 N
...
4 O* e$ X4 q# }- ~& F如果任何参数的@what,@where被发送到存储过程NULL值,那么所述条件将被忽略。您可以使用0而不是null作为测试值,这将类似于@what
, v$ v! b. |) J= 0 OR ...
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则