sqlserver中搜索请求的优化
我正在为我的数据库创建一个搜索功能,它采用关键字并在3个表中的每个指定列中查找 表1为利用率 表2为ReserveLocaux 表3被称为Usilizateurs_ReserveLocaux,它将用户和预订与其主键联系起来 这是我到目前为止的想法sqlserver中搜索请求的优化,sql,sql-server-2008,search,Sql,Sql Server 2008,Search,我正在为我的数据库创建一个搜索功能,它采用关键字并在3个表中的每个指定列中查找 表1为利用率 表2为ReserveLocaux 表3被称为Usilizateurs_ReserveLocaux,它将用户和预订与其主键联系起来 这是我到目前为止的想法 ALTER PROCEDURE Search_ReservLocaux -- Add the parameters for the stored procedure here @keyword as varchar(100), @noUsager
ALTER PROCEDURE Search_ReservLocaux
-- Add the parameters for the stored procedure here
@keyword as varchar(100),
@noUsager as int
AS
declare @searchTerm as varchar(105) = cast('%' + @keyword + '%' as varchar(105))
--Select all reservations information where allowed field include search term
--where the user making the request participates in
--where additional user are part of the same reservation
select distinct a.NoReservation,a.ApprobationProf,a.Commentaire,a.Date,a.HeureDébut,a.HeureFin,a .NoLocal,a.NoReservation,a.PersonnesExt from ReserveLocaux a
join Utilisateurs_ReserveLocaux b on a.NoReservation = b.NoReservation
join Utilisateurs c on c.id= b.NoUsager
where(
a.[Date] like @searchTerm or
a.[HeureDébut] like @searchTerm or
a.[HeureFin] like @searchTerm or
a.[Commentaire] like @searchTerm or
a.[CommentaireGardien] like @searchTerm or
a.[ApprobationProf] like @searchTerm or
a.[NoLocal] like @searchTerm or
a.[Actif] like @searchTerm or
a.[PersonnesExt] like @searchTerm or
b.[NoUsager] like @searchTerm or
b.[NoReservation] like @searchTerm or
c.[NomUsager] like @searchTerm or
c.[PrenomUsager] like @searchTerm
)
and(a.Actif is null or a.Actif = 1)
and b.NoUsager = @noUsager
Return
GO
exec Search_ReservLocaux 'saoindoaisn',3
go
基本上,通过这个搜索,我得到了我需要的大部分信息。问题是,我还需要查找在Utisulateurs_ReserveLocaux表中找到的具有相同预订号码的每个用户,该表如下所示:
|Id_User|Id_Reservation|
3 45
4 45
5 32
我需要访问用户#3(进行搜索的用户)和用户#4(称为“saoindoaisn”)
我知道问题出在where语句的最后一行
b.NoUsager = @noUsager
但是如果我删除它,我的数据就会失去安全性,因为进行搜索的用户可以访问他没有参与的所有内容,如果我保留它,我就无法访问所需的数据
有人能帮我找到这条线的替代品吗
PS:如果不是100%清楚,很抱歉。你在找这个吗
b.Id_Reservation in (select id_reservation
from Utilisateurs_ReserveLocaux url2
where url2.NoUsager = @noUsager
)
很难说您的整个查询逻辑是否可以简化,但我认为这符合您对外部
where
子句的要求。它不起作用。错误:**子查询返回了多个值。当子查询在=、!=、=或者当子查询用作表达式时。**该查询返回@noUsager所做的所有保留。@ThalForms。每个用户的示例数据在该表中只有一行。更通用的方法是在中使用而不是=
。我修改了您的查询,因此在(code)中使用了b.Id\u reservation而不是b.Id\u reservation=(code),它可以工作。多谢各位@GordonLinoff,如果子查询返回空值,则实际处于命令中是危险的。@RGS。如果子查询返回NULL
值,则表中没有匹配项,表达式返回false(或至少不是true)。我看不出有什么危险。也许您将
中的与
中的混淆了。