sqlserver中搜索请求的优化

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

我正在为我的数据库创建一个搜索功能,它采用关键字并在3个表中的每个指定列中查找

表1为利用率

表2为ReserveLocaux

表3被称为Usilizateurs_ReserveLocaux,它将用户和预订与其主键联系起来

这是我到目前为止的想法

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)。我看不出有什么危险。也许您将
中的
中的
混淆了。