多where语句的过程

时间:2018-11-05 13:08:18

标签: sql sql-server

具有下表

table TableAB(
        ColumnA int,
        ColumnB nvarchar(50)
)

我需要创建一个过程,该过程返回 ColumnA ColumnB 并接受两个参数(在现实生活中,参数数量超过20)。所有搜索都应使用通配符“%”。

procedure has input parameters
        @ColumnA int,
        @ColumnB nvarchar(50)

我有两种方法

1。

select ColumnA,ColumnB from TableAB
where 
     ColumnA like 
     case  @ColumnA
        when @ColumnA NULL then ColumnA
        else '%' + CONVERT(varchar(10),@ColumnA)+'%'
     end
     and
     ColumnB like 
     case  @ColumnB
        when @ColumnB NULL then ColumnB
        else '%' + ColumnB +'%'
     end 

2。

 DECLARE @TabWhereConditions TABLE(Id INT IDENTITY(1,1), Condition VARCHAR(MAX))
    ...
    SET @ParamDefenition = '@pColumnA int, @pColumnB nvarchar(50)'

    IF(NOT @ColumnA IS NULL)
    BEGIN
        INSERT INTO @TabWhereConditions(Condition) 
        VALUES('ColumnA like ' + '''%' + CONVERT(varchar(10),@ColumnA) + '%''') 
    END 
    IF(NOT @ColumnB IS NULL)
    BEGIN
        INSERT INTO @TabWhereConditions(Condition) 
        VALUES('ColumnA like ' + '''%' + @ColumnB + '%''')  
    END  

    DECLARE CondCursor CURSOR FOR
    SELECT Condition FROM @TabWhereConditions
    OPEN CondCursor

    SET @WhereString = ''
    FETCH NEXT FROM CondCursor INTO @WhereCondition
    WHILE @@FETCH_STATUS = 0
    BEGIN
        SET @WhereString = @WhereString + @WhereCondition + ' AND '

        FETCH NEXT FROM CondCursor INTO @WhereCondition
    END

    CLOSE CondCursor
    DEALLOCATE CondCursor

    SET @WhereString =  SUBSTRING(@WhereString,1, LEN(@WhereString)-4)

    SET @SqlCommand = '
    SELECT 
      ColumnA,
      ColumnB
    FROM TableAB 
    WHERE ' + @WhereString 


    EXECUTE sp_executesql @SqlCommand, @ParamDefenition, 
        @pColumnA = @ColumnA, 
        @pColumnB = @ColumnB,

哪种方法更好?第一或第二,或您的建议 注意:对于过程可能需要1到20个参数,每个调用可以获取不同数量的参数的情况,我需要解决方案

2 个答案:

答案 0 :(得分:3)

我相信您想沿着这些思路使用一些东西

select ColumnA,ColumnB from TableAB
where (@columnA is null or ColumnA like '%'+CONVERT(varchar(10),@ColumnA)+'%' and
      (@columnB is null or ColumnB like '%'+CONVERT(varchar(10),@ColumnB)+'%'

this Aaron Bertrand博客文章中所述,使其成为动态T-SQL是一个好主意。因此,您可以使用sys.sp_executesql来运行上面的语句。

答案 1 :(得分:2)

在有多个where条件的情况下,您可以创建执行存储过程或查询,如下所示。

0

希望这会对您有所帮助。