У меня запрос на SQL Сервер, используется CTE
. Запрос генерируется динамически каждый раз, когда процедура запускается с несколькими параметрами в WHERE clause
, которые должны быть присоединены на основе параметров, имеющих значения. Проблема в том, что есть несколько значений, которые нужно добавить в зависимости от условия. Поэтому пользователь не может передавать никакие значения, тогда WHERE clause
нет. Но если пользователь передает все параметры, это любой параметр, то как мне добавить его, используя and
. Из-за этого сгенерированного запроса, имеющего синтаксическую ошибку. Как мне исправить это?
declare @vflag varchar(50)=null, @udisecode varchar(20)='1141701604', @district int=null, @zone int=0, @block int=null,
@classid int=null, @className varchar(10)=null, @report varchar(20)=null, @gender varchar(6)=null,
@religion int=null, @category int=null, @subjectid int=null, @subject varchar(30)=null,
@querystr varchar(MAX)=null
set @querystr='
;with cte1 as(
select udise_no,student_regno,fullname,dob,domicile_yesno,admission_date,gender,class_id from tbl_personal
),cte2 as(
select udise_no,student_regno,religion_id,student_category,student_caste from tbl_reservation
),cte3 as(
select categoryname,ID from tbl_category
),cte4 as(
select id,religion from tbl_religion
),cte5 as(
select udisecode,school_name,district_id,block_id from school_master
),cte6 as(
select district_id,district_name from district_master
),cte7 as(
select block_id,block_name,district_id from block_master
)
select a.udise_no, a.fullname as studentname,a.gender,REPLACE(CONVERT(varchar,a.dob,106),'' '',''-'') as dob,
ISNULL(d.categoryname,'''') as category,
ISNULL(c.religion,'''') as religion,
a.domicile_yesno as domicile,a.class_id as class,
a.student_regno,
schoolmaster.school_name,
districtmaster.district_name as district,
blockmaster.block_name
from cte1 a
left join cte2 b
ON b.udise_no=a.udise_no and b.student_regno=a.student_regno
left join cte4 c
on c.ID=b.religion_id
left join cte3 d
on d.ID=b.student_category
left join cte5 schoolmaster
on a.udise_no=schoolmaster.udisecode
left join cte6 districtmaster
on districtmaster.district_id=schoolmaster.district_id
left join cte7 blockmaster
on blockmaster.district_id=districtmaster.district_id and
blockmaster.district_id=schoolmaster.district_id and
blockmaster.block_id=schoolmaster.block_id'
if(@district is not null OR @block is not null OR @udisecode is not null OR
@className is not null OR @category is not null OR @religion is not null OR
@gender is not null)
set @querystr += ' Where '
if(@district is not null)
set @querystr += ' convert(varchar,schoolmaster.district_id) LIKE '''+ISNULL(convert(varchar,@district),'%')+''''
if(@block is not null)
set @querystr += ' and convert(varchar,schoolmaster.block_id) LIKE '''+ISNULL(convert(varchar,@block),'%')+''''
if(@udisecode is not null)
set @querystr += ' and a.udise_no LIKE '''+ISNULL(@udisecode,'%')+''''
if(@className is not null)
set @querystr += ' and a.class_id LIKE '''+ISNULL(@className,'%')+''''
if(@category is not null)
set @querystr += ' and CONVERT(varchar,b.student_category) LIKE '''+ISNULL(CONVERT(varchar,@category),'%')+''''
if(@religion is not null)
set @querystr += ' and CONVERT(varchar,b.religion_id) LIKE '''+ISNULL(CONVERT(varchar,@religion),'%')+''''
if(@gender is not null)
set @querystr += ' and a.gender LIKE '''+ISNULL(@gender,'%')+''''
set @querystr += ' order by districtmaster.district_name,blockmaster.block_name'
print(@querystr)
--exec(@querystr)
Синтаксическая ошибка:
Where and a.udise_no LIKE '1141701604' order by districtmaster.district_name,blockmaster.block_name