回答

收藏

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

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

我正在使用SQL Server 2008
( J, K8 n% X# ~Express,并且具有一个存储过程,该存储过程SELECT基于参数执行from表。我有nvarchar参数和int参数。1 N7 n, E9 ^7 K/ b2 V* s$ P# a
这是我的问题,我的where子句如下所示:
% h/ |. _! V/ |WHERE [companies_SimpleList].[Description] Like @What 5 ?7 ]* s& h$ ]8 w# R. m
    AND companies_SimpleList.Keywords Like @Keywords, c+ `  S) y% v5 D0 A
    AND companies_SimpleList.FullAdress Like @Where
" ?1 l5 e) k# c! m+ ~    AND companies_SimpleList.ActivityId = @ActivityId
1 D0 B1 z% ]4 E, l, w, e, w0 L    AND companies_SimpleList.DepartementId = @DepartementId7 I3 B* T" r; d( m! Y
    AND companies_SimpleList.CityId = @CityId, h) c5 M) u: {# m" v2 L5 q0 A
此参数是我的ASP.NET MVC
! \- V) J3 M& A8 l0 I* n/ a1 Y3应用程序的用户设置的筛选器值,并且int可能未设置参数,因此它们的值将为0。这是我的问题,存储过程将搜索具有0asCityId值的项例如,为此,它将返回错误的结果。因此,基于int参数的值是否大于0,能够有一个动态的where子句会很好。( Z2 P- l' X& Q- p/ ~
提前致谢' ~. {3 K8 q- u3 O
               
& N8 Y9 W, C6 y9 F/ H解决方案:
0 Y. U" u4 p/ F3 X- A               
$ m9 g- [' F% n; A+ f( q5 O. B$ ^
' R( A# O+ X5 G" P$ b( ]
                尝试以下方法:
; w/ |1 E% b- i  UWHERE 1 = 1
! {  o, {0 C- `AND (@what     IS NULL OR [companies_SimpleList].[Description] Like @What )
) J; L8 N# t- G" g7 e2 Z5 V: i* E7 h5 mAND (@keywords IS NULL OR companies_SimpleList.Keywords        Like @Keywords)
. u( B/ W: A4 `8 HAND (@where    IS NULL OR companies_SimpleList.FullAdress      Like @Where)
  Y3 M" L4 D* a# T% C/ J+ `...3 y4 l$ ?1 J9 Z$ ?% z! R0 v! r
如果任何参数的@what,@where被发送到存储过程NULL值,那么所述条件将被忽略。您可以使用0而不是null作为测试值,这将类似于@what
1 ~2 T, H% p" y$ y= 0 OR ...
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则