【问题标题】:Dynamic query (in stored procedure) based on params provided (SQL Server 2016)基于提供的参数的动态查询(在存储过程中)(SQL Server 2016)
【发布时间】:2019-05-29 06:57:00
【问题描述】:

我有一个包含 30 多列的员工表。此表由 Web 服务通过返回所有用户的存储过程公开。

我需要创建一个允许您搜索 6 个特定列的新存储过程。我将这些列作为存储过程的输入参数,但我不确定如何创建只使用传递的参数的查询。

例如:

exec SearchUsers @firstName = 'John', @department = 'Admin'

应该只执行那些列的查询。但是,有 5 个可用的参数可以传入。

这是我的参数

@lastName nvarchar(255) = '',
@firstName nvarchar(255)  = '',
@office nvarchar(50)  = '',
@department nvarchar(50)  = '',
@language nvarchar(255)  = '',
@jobTitle nvarchar(255) = '',

我想构建一个足够动态的查询,只查询提供的值。

【问题讨论】:

标签: sql-server stored-procedures case


【解决方案1】:

在 where 子句中,除了您的正常条件之外,您只需为每个参数添加一个条件 OR @param1 IS NULL。因此,如果参数为空,则整个条件将被“忽略”,因为它始终为真。

【讨论】:

    【解决方案2】:

    因此您可以将参数默认更改为“null”

    @lastName nvarchar(255) = null,
    @firstName nvarchar(255)  = null,
    @office nvarchar(50)  = null,
    @department nvarchar(50)  = null,
    @language nvarchar(255)  = null,
    @jobTitle nvarchar(255) = null,
    

    然后在你的 where 子句中,在将值与相应字段进行比较之前检查是否存在 NULL。

    where (@lastName is null or lastname = @lastName)
    and (@firstName is null or firstName = @firstName)
    and (@office is null or office = @office)
    and (@department is null or department = @department)
    and (@language is null or language = @language)
    and (@jobTitle is null or jobTitle = @jobTitle)
    

    【讨论】:

      【解决方案3】:

      这里是一个例子:

      Create PROCEDURE [dbo].[SearchUsers] ( 
      
      @lastName Varchar(255) = '',
      @firstName Varchar(255)  = '',
      @office Varchar(50)  = '',
      @department Varchar(50)  = '',
      @language Varchar(255)  = '',
      @jobTitle Varchar(255) = ''
      
      AS
      
      Set Nocount On
      
      Select lastname,firstname,office,departament,language,jobtitle From Users (Nolock)
      Where
      lastname Like Case When @lastName <> '' Then @lastName Else lastname End
      And firstname Like Case When @firstName <> '' Then @firstName Else firstname End
      And office Like Case When @office <> '' Then @office Else office End
      And departament Like Case When @department <> '' Then @department Else departament End
      And language Like Case When @jobTitle <> '' Then @jobTitle Else jobtitle End
      
      Set Nocount Off
      
      
      exec SearchUsers @firstName = 'John', @department = 'Admin'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-20
        相关资源
        最近更新 更多