【问题标题】:SQL Stored Procedure: Conditional ReturnSQL 存储过程:条件返回
【发布时间】:2025-12-27 09:45:10
【问题描述】:

您好,我想创建一个简单的存储过程,它执行以下操作:

伪代码

@tempSelect = "SELECT * FROM Table"

if (@Param is NULL) then
 exec @tempSelect
else
 exec @tempSelect + ' WHERE id = ' + @Param + '

这种方法有效吗?谢谢。

【问题讨论】:

    标签: sql stored-procedures branch


    【解决方案1】:

    试试

    select *
    from table
    where id=isnull(@param, id)
    

    【讨论】:

    • 谢谢,我知道有更好的办法。
    • +1 很好 - 易于理解并且比我的答案更好,除非您使用的是庞大的数据集(如果您要返回所有内容,我希望您不是这样)。
    • 使用该解决方案您可能会遇到性能问题,因为不会使用 ID 列上的索引。我不了解您的数据库,但我很确定 Oracle 的 NVL 功能就是这种情况。
    • @Mark Brittingham-谢谢马克
    【解决方案2】:

    从表中选择 * 其中(ID = @Param 或 @Param 为空)

    或者

    从表中选择 * 其中 ID=Coalesce(@Param, ID)

    [如果您的目标是效率,请将 * 替换为您要返回的特定字段。]

    【讨论】:

      【解决方案3】:

      是的——我当然认为它没有任何问题。你可以让它更简单:

      Set NOCOUNT On;
      if (@Param is NULL) 
         Select * From Table;
      else 
         Select * From Table Where (ID=@Param);
      

      注意:不过,我可能会拼出这些字段。

      【讨论】:

        【解决方案4】:

        根据情况,我可能会使用动态 SQL。

        但是,如果 @param 来自用户,您需要记住 SQL 注入,这就是为什么您永远不应该将参数直接添加到您的 sql。

        在 t-sql 中它看起来像(在我的脑海中并且未经测试;):

        DECLARE @SQL NVARCHAR(MAX)
        
        SET @SQL = N'
          SELECT ...
          FROM   table t
          WHERE  1 = 1' (
        
        IF(@param IS NOT NULL)
          SET @SQL = @SQL + '
            AND t.id = @id'
        
        ... possibly more things added to the query ...
        
        EXEC sp_executesql 
           @SQL
        , '@id AS INT'
        ,  @id = @Param
        

        通过这样做,您将获得针对每种情况的优化查询计划(并且通过使用 sp_executesql,查询缓存也将被使用)

        我会特别避免使用 OR 解决方案,如果您检查使用 OR 生成的查询计划与不使用 OR 生成的查询计划相比,您就会明白为什么。

        【讨论】:

          【解决方案5】:

          试试这个代码:

          CREATE PROCEDURE [dbo].[ProcedureName]
          @Param varchar(50)
          
          AS
          BEGIN
          
          declare @tempSelect nvarchar(max)  
          
          SET NOCOUNT ON;
          
          set @tempSelect = 'SELECT Col1, Col2 FROM Table where Col1 <> '' '
          
                   if @Param <> '' 
              begin
              set @resultSet = @resultSet +  ''' and Col1='''+@Param1 
              end
          
          
          EXEC(@resultSet)
          
          END
          

          【讨论】: