【问题标题】:query using the where clause if variables are not null [duplicate]如果变量不为空,则使用 where 子句查询 [重复]
【发布时间】:2018-09-05 14:33:01
【问题描述】:

我正在尝试查询但没有成功,我正在尝试做的是:

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 子句返回结果(现在不起作用)。

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

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

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

【问题讨论】:

  • 这是一种捕获所有查询的类型。 Gail Shaw 在这里写了博客。 sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries 然后在这里跟进。 sqlservercentral.com/blogs/sqlinthewild/2018/03/13/…
  • @TabAlleman - 我不认为你标记的副本是一回事。那是在谈论传递一个完全不同的表名。
  • @TabAlleman 但这并不是询问是否将列名作为参数传递。这是关于当参数的值为NULL时调整where子句。而且我输错了表格而不是列;)
  • 我认为 OP 实际上是在尝试实现两者。
  • @SeanLange,我想说这个问题可以重新编写以解决这个问题,但困扰已发布代码的问题与标记副本中的问题相同。当您想在 SQL Server 中为对象名称使用变量时,您必须使用动态 SQL 或通过条件逻辑发挥创意,副本中最受好评的答案显示了如何使用。仅研究标记的重复项可能会引导发布者找到解决方案,但如果没有,问题可能会被重新措辞,或者可能会创建一个新问题。

标签: sql sql-server tsql stored-procedures


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2012-07-16
    • 2018-12-23
    • 1970-01-01
    • 1970-01-01
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多