【问题标题】:SQL search query not showing correct resultSQL 搜索查询未显示正确结果
【发布时间】:2016-09-12 06:34:25
【问题描述】:

我正在尝试创建一个从表employee 中搜索员工的存储过程。

我的查询看起来像这样

ALTER PROCEDURE [dbo].[EmployeeList]
    @CurrentPageNo INT = null,
    @PageSize INT = 5,
    @FirstName VARCHAR(100),
    @Email VARCHAR(100),
    @DeptId int = null
AS
BEGIN
    DECLARE @StartRecordNo INT, @EndRecordNo INT

    IF @CurrentPageNo IS NULL
        SET @CurrentPageNo = 1

    SET @StartRecordNo = ((@CurrentPageNo - 1) * @PageSize)
    SET @EndRecordNo = @StartRecordNo + @PageSize

    SELECT 
        ROW_NUMBER() OVER (ORDER BY CreatedByDate desc) As srno,
        EmployeeID, FirstName, LastName, Email, DateOfBirth, Joining, 
        MobileNumber, MonthsOfExperience, TotalExperience, DepartmentName 
    FROM
        Employee
    INNER JOIN
        Department ON Employee.DeptId = Department.DepartmentID
    WHERE   
        (ISNULL(@FirstName, '') = '' OR Employee.FirstName LIKE '%' + FirstName + '%') 
        AND 
        (ISNULL(@Email, '') = '' OR Employee.Email LIKE '%' + @Email + '%')  
        AND
        (@DeptId IS NULL OR Employee.DeptId = @DeptId)
END

程序编译成功。但是当像

一样执行它时
exec EmployeeList 1,10,'shaili','',null

它也显示其他记录。谁能解释一下?我只想要给定名称的记录。

我得到的结果:

【问题讨论】:

  • 在 where close 中尝试仅按 FirstName 查找。
  • 删除 "%" 。 proc 在这里为您提供所有包含“sh”的名称。
  • @Lasith 通过评论另外两行来做到这一点。我用名字 VIKAS 搜索,仍然显示所有三个结果。我是否缺少一些逻辑。
  • @Sami 如果我用 vikas 搜索会怎样。仍然显示相同的结果。
  • 问题在于 or 子句 OR 只计算表达式,直到找到 TRUE 结果

标签: sql-server tsql stored-procedures


【解决方案1】:
#Siddhant only little mistake by you. i.e you pass FirstName instead of @FirstName. check below code.

ALTER PROCEDURE [dbo].[Test_EmployeeList]
        @CurrentPageNo INT = null,
        @PageSize INT=5,
        @FirstName VARCHAR(100),
        @Email VARCHAR(100),
        @DeptId int = null

    AS
    BEGIN
     DECLARE @StartRecordNo INT,@EndRecordNo INT

     IF @CurrentPageNo IS NULL
        SET @CurrentPageNo=1

    SET @StartRecordNo=((@CurrentPageNo-1) * @PageSize)
    SET @EndRecordNo=@StartRecordNo + @PageSize
    SELECT ROW_NUMBER()OVER(ORDER BY Reg_Date desc) As srno,
     F_Name, L_Name, Email, Mobile, Reg_Date from tbl_LoginMaster
    inner join tbl_Login_Detail
    ON tbl_LoginMaster.User_Id = tbl_Login_Detail.User_Id


    WHERE   (ISNULL(@FirstName,'')='' OR tbl_LoginMaster.F_Name LIKE '%'+@FirstName+'%') AND 
        (ISNULL(@Email,'')='' OR tbl_LoginMaster.Email LIKE '%'+@Email+'%') AND
        (@DeptId is null OR tbl_LoginMaster.User_Id = @DeptId )
    END
    GO


    exec Test_EmployeeList 1,10,'Mohit','',null

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2020-05-16
    • 2017-02-19
    相关资源
    最近更新 更多