Here I am not going to talk about fulltext search as generally in small applications which not that expensive servers we do not really go for full text indexes. Thus we are going to talk about wild card search.
Now a days providing search facility to end user has become quite normal. Users generally will have 'n' fields to search. They can search by providing values for all fields or they may provide values for only one field.
There are two solutions to this:-
The one i like -
I have not put any validation in place which we should as if there is no parameter specified the procedure will fail because of bad syntax as there will be a bad where clause. Thus check if no parameter is spec
CREATE PROCEDURE SearchProcedureName
-- Add the parameters for the stored procedure here
@Name VARCHAR(100),
@Id VARCHAR(10),
@error int output
AS
BEGIN
set @error = -1
if((ISNULL(@Name, '') ='') and (ISNULL(@Id, '') =''))
begin
return
end
begin try
declare @query varchar(max)
set @query = ''
set @query = 'SELECT *
FROM t_users
where '
declare @var varchar(1000) = ''
if((ISNULL(@Name, '') <>''))
begin
if(isnull(@var,'') <> '')
set @var = ' and userName LIKE ''%' + @Name + '%'' '
else
set @var = ' userName LIKE ''%' + @Name + '%'' '
set @query = @query + @var
end
if((ISNULL(@Id, '') <>''))
begin
if(isnull(@var,'') <> '')
set @var = ' and userId LIKE ''%' + @Id+ '%'' '
else
set @var = ' userId ''%' + @Id+ '%'' '
set @query = @query + @var
end
-- and so on....
exec(@query)
set @error = 0
end try
begin catch
--handle exception
end catch
END
And the one I do not like -
CREATE PROCEDURE SearchProcedureName
-- Add the parameters for the stored procedure here
@Name VARCHAR(100),
@Id VARCHAR(10),
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT *
FROM t_users
WHERE ((ISNULL(@Name, '') = '') OR username LIKE '%' + @Name + '%')
AND ((ISNULL(@Id, '') = '') OR userid LIKE '%' + @Id + '%')
END
The reason one should go for the first solution is:- In solution 2 wild card will be used even if the user do not provide any value for a particular parameter. This leads to lot of table scans. Over a period of time as the user base increases and as the data increases this hits the performance really badly.
Now a days providing search facility to end user has become quite normal. Users generally will have 'n' fields to search. They can search by providing values for all fields or they may provide values for only one field.
There are two solutions to this:-
The one i like -
I have not put any validation in place which we should as if there is no parameter specified the procedure will fail because of bad syntax as there will be a bad where clause. Thus check if no parameter is spec
CREATE PROCEDURE SearchProcedureName
-- Add the parameters for the stored procedure here
@Name VARCHAR(100),
@Id VARCHAR(10),
@error int output
AS
BEGIN
set @error = -1
if((ISNULL(@Name, '') ='') and (ISNULL(@Id, '') =''))
begin
return
end
begin try
declare @query varchar(max)
set @query = ''
set @query = 'SELECT *
FROM t_users
where '
declare @var varchar(1000) = ''
if((ISNULL(@Name, '') <>''))
begin
if(isnull(@var,'') <> '')
set @var = ' and userName LIKE ''%' + @Name + '%'' '
else
set @var = ' userName LIKE ''%' + @Name + '%'' '
set @query = @query + @var
end
if((ISNULL(@Id, '') <>''))
begin
if(isnull(@var,'') <> '')
set @var = ' and userId LIKE ''%' + @Id+ '%'' '
else
set @var = ' userId ''%' + @Id+ '%'' '
set @query = @query + @var
end
-- and so on....
exec(@query)
set @error = 0
end try
begin catch
--handle exception
end catch
END
And the one I do not like -
CREATE PROCEDURE SearchProcedureName
-- Add the parameters for the stored procedure here
@Name VARCHAR(100),
@Id VARCHAR(10),
AS
BEGIN
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
-- Insert statements for procedure here
SELECT *
FROM t_users
WHERE ((ISNULL(@Name, '') = '') OR username LIKE '%' + @Name + '%')
AND ((ISNULL(@Id, '') = '') OR userid LIKE '%' + @Id + '%')
END
The reason one should go for the first solution is:- In solution 2 wild card will be used even if the user do not provide any value for a particular parameter. This leads to lot of table scans. Over a period of time as the user base increases and as the data increases this hits the performance really badly.
Good one Anuj!
ReplyDeleteThnx for your kind words. It really motivates me to share more. :)
ReplyDelete