How can I use optional parameters in a T-SQL stored procedure?

后端 未结 6 794
天涯浪人
天涯浪人 2020-11-22 05:56

I am creating a stored procedure to do a search through a table. I have many different search fields, all of which are optional. Is there a way to create a stored procedur

6条回答
  •  滥情空心
    2020-11-22 06:36

    The answer from @KM is good as far as it goes but fails to fully follow up on one of his early bits of advice;

    ..., ignore compact code, ignore worrying about repeating code, ...

    If you are looking to achieve the best performance then you should write a bespoke query for each possible combination of optional criteria. This might sound extreme, and if you have a lot of optional criteria then it might be, but performance is often a trade-off between effort and results. In practice, there might be a common set of parameter combinations that can be targeted with bespoke queries, then a generic query (as per the other answers) for all other combinations.

    CREATE PROCEDURE spDoSearch
        @FirstName varchar(25) = null,
        @LastName varchar(25) = null,
        @Title varchar(25) = null
    AS
    BEGIN
    
        IF (@FirstName IS NOT NULL AND @LastName IS NULL AND @Title IS NULL)
            -- Search by first name only
            SELECT ID, FirstName, LastName, Title
            FROM tblUsers
            WHERE
                FirstName = @FirstName
    
        ELSE IF (@FirstName IS NULL AND @LastName IS NOT NULL AND @Title IS NULL)
            -- Search by last name only
            SELECT ID, FirstName, LastName, Title
            FROM tblUsers
            WHERE
                LastName = @LastName
    
        ELSE IF (@FirstName IS NULL AND @LastName IS NULL AND @Title IS NOT NULL)
            -- Search by title only
            SELECT ID, FirstName, LastName, Title
            FROM tblUsers
            WHERE
                Title = @Title
    
        ELSE IF (@FirstName IS NOT NULL AND @LastName IS NOT NULL AND @Title IS NULL)
            -- Search by first and last name
            SELECT ID, FirstName, LastName, Title
            FROM tblUsers
            WHERE
                FirstName = @FirstName
                AND LastName = @LastName
    
        ELSE
            -- Search by any other combination
            SELECT ID, FirstName, LastName, Title
            FROM tblUsers
            WHERE
                    (@FirstName IS NULL OR (FirstName = @FirstName))
                AND (@LastName  IS NULL OR (LastName  = @LastName ))
                AND (@Title     IS NULL OR (Title     = @Title    ))
    
    END
    

    The advantage of this approach is that in the common cases handled by bespoke queries the query is as efficient as it can be - there's no impact by the unsupplied criteria. Also, indexes and other performance enhancements can be targeted at specific bespoke queries rather than trying to satisfy all possible situations.

提交回复
热议问题