SQL Server 2008 R2: Prepare Dynamic WHERE Clause

前端 未结 3 928
你的背包
你的背包 2021-01-17 03:06

I have the following stored procedure with four parameters.

Stored procedure spTest:

CREATE PROCEDURE spTest
    @Name varchar(20) = \'\         


        
相关标签:
3条回答
  • 2021-01-17 03:51

    I update the @Zohar answer. Define blank is bad habits, ideally define with null and later use blank. So the query will be

    CREATE PROCEDURE spTest
        @Name varchar(20) = null,
        @Address varchar(100) = null,
        @City varchar(50) = null,
        @Pin varchar(50) = null
    AS
        SELECT * 
        FROM Test_Table 
        WHERE (Name = ISNULL(@Name,'') )
        AND (Address = ISNULL(@Address,''))
        AND (City = ISNULL(@City,''))
        AND (Pin = ISNULL(@Pin,''));
    GO
    

    Even I like the @Biswa answer as it use current version of sql server, but Sqlserver 2008R2 does not have this function.

    0 讨论(0)
  • 2021-01-17 03:52

    You can use ISNULL and NULLIF also in this case:
    below code should work :

    CREATE PROCEDURE spTest
        @Name varchar(20) = '',
        @Address varchar(100) = '',
        @City varchar(50) = '',
        @Pin varchar(50) = ''
    AS
        SET @Name=NULLIF(@Name,'')
        SET @Address=NULLIF(@Address,'')
        SET @City=NULLIF(@City,'')
        SET @Pin=NULLIF(@Pin,'')
    
        SELECT * 
        FROM Test_Table 
        WHERE Name = ISNULL(@Name,Name)
        AND Address = ISNULL(@Address,Address)
        AND City = ISNULL(@City,City)
        AND Pin = ISNULL(@Pin,Pin)
    
    GO
    
    0 讨论(0)
  • 2021-01-17 03:58

    It's called catch-all queries and it basically goes like this:

    CREATE PROCEDURE spTest
        @Name varchar(20) = '',
        @Address varchar(100) = '',
        @City varchar(50) = '',
        @Pin varchar(50) = ''
    AS
        SELECT * 
        FROM Test_Table 
        WHERE (@Name = '' OR Name = @Name)
        AND (@Address = '' OR Address = @Address)
        AND (@City = '' OR City = @City)
        AND (@Pin = '' OR Pin = @Pin);
    GO
    

    You also might want to read this article about catch all queries

    0 讨论(0)
提交回复
热议问题