代码之家  ›  专栏  ›  技术社区  ›  E.Meir

如果变量不为null,则使用where子句进行查询[重复]

  •  0
  • E.Meir  · 技术社区  · 6 年前

    ALTER PROCEDURE [dbo].[spPagination] -- ORDER BY id
        @filterCol NVARCHAR(20) = NULL, --<<<<
        @filterValue NVARCHAR(40) = NULL, --<<<<
        @PageNumber INT,
        @PageSize INT
    AS
    BEGIN
        SET NOCOUNT ON;
    
        SELECT      
            Emp.id , Emp.email, Emp.[firstName], Emp.[lastName], Emp.[salary], 
            Emp.[startDateWork], Emp.age, Rol.[name] AS Role
        FROM        
            [dbo].tblEmployees5m Emp
        INNER JOIN
            [dbo].[tblRoles] Rol ON Emp.roleId = Rol.id
        WHERE       
            @filterCol LIKE '%' + @filterValue + '%' --<<<< 
        ORDER BY    
            id
            OFFSET @PageSize * (@PageNumber - 1) ROWS
            FETCH NEXT  @PageSize ROWS ONLY OPTION (RECOMPILE);
    
        SELECT COUNT(1) AS totalCount 
        FROM [dbo].tblEmployees5m
    END
    

    我试图应用过滤器的结果,根据 @filterCol @filterValue -如果它们不为NULL,那么我想用where子句返回结果(现在不起作用)。

    否则,如果有两个值 NULL 那就不要用where子句了。 @滤池 @筛选值 将保留列值。

    我建议使用动态SQL,我也读过这篇文章,但我不明白使用它有什么好处。。这条路对吗?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Prahalad Gaggar    6 年前

    Read

    ALTER PROCEDURE [dbo].[spPagination] -- ORDER BY id
      @filterCol NVARCHAR(20) = NULL, --<<<<
      @filterValue NVARCHAR(40) = NULL, --<<<<
      @PageNumber INT,
      @PageSize   INT
    AS
    BEGIN
      SET NOCOUNT ON;
    
        DECLARE @SQL NVARCHAR(max)
        SET @SQL='SELECT      Emp.id , Emp.email, Emp.[firstName], Emp.[lastName], Emp.[salary], Emp.[startDateWork], Emp.age  , Rol.[name] as Role
        FROM        [dbo].tblEmployees5m    Emp
        inner join  [dbo].[tblRoles]        Rol
        ON          Emp.roleId = Rol.id
        WHERE 1=1'
    
        IF ISNULL(@filterCol,'')!='' AND ISNULL(@filterCol,'')!=''
            SET @SQL= @SQL+' AND @fc LIKE ''%@fv%'''
    
        SET @SQL = @SQL+' ORDER BY    id'
    
        IF ISNULL(@PageNumber,'')!='' AND ISNULL(@PageSize,'')!=''
            SET @SQL= @SQL+'
            OFFSET  @PS * (@PN - 1)  ROWS
            FETCH NEXT  @PN ROWS ONLY OPTION (RECOMPILE);'
    
    
    
    
        EXEC SP_EXECUTESQL @SQL, N'@fc NVARCHAR(20) ,@fv NVARCHAR(40) ,@PN INT,@PS INT',@fc=@filterCol,@fv=@filterValue,@PG=@PageNumber,@PS=@PageSize
    
        select count(1) as totalCount from [dbo].tblEmployees5m
    END