首页 > 解决方案 > 如果变量不为空,则使用 where 子句查询

问题描述

我试图查询但没有成功,我想做的是:

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

我正在尝试根据@filterColand对结果应用过滤器@filterValue- 如果它们不是 NULL ,那么我想用 where 子句返回结果(现在不起作用)。

否则,如果有 2 个值,NULL则不要应用 where 子句。@filterCol将保存列名。@filterValue将保存列值。

我怎样才能做到这一点?有一个更好的方法?

我建议使用动态 SQL 并阅读了有关它的信息,但我不明白使用它有什么好处……这是正确的方法吗?

标签: sqlsql-servertsqlstored-procedures

解决方案


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

推荐阅读