post icon

Dynamic Stored Procedure Query to search with filter and with AND/OR user condition

Stored Procedure dinamica per eseguire una ricerca con filtri e condizione AND/OR impostata dall’Utente

Voglio rendere disponibile a voi tutti la seguente quary che ho avuto modo di implementare molte volte.

In pratica in una form di ricerca, oltre ai campi su cui cercare spesso si aggiunge un radiobutton per impostare la condizione di ricerca sui campi (AND oppure OR)

In questo caso, spesso ho trovato query immerse nel codice (ad esempio C#) che venivano costruite lato server in base alla condizione impostata dall’utente e successivamente inviate al DBMS.

Di seguito il codesnippet che vi consente di evitare questo hard-coding e di creare una Stored Procedure con tutti i suoi vantaggi:

USE [Northwind]
GO

DECLARE @CONDITION VARCHAR(3)
SET @CONDITION = 'AND'    /* SET @CONDITION = 'OR' */

DECLARE @NAME VARCHAR(40)
DECLARE @ADDRESS NVARCHAR(40)
SET @NAME = 'MARIA'
SET @ADDRESS = NULL

SELECT [CustomerID]
      ,[CompanyName]
      ,[ContactName]
      ,[ContactTitle]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[Phone]
      ,[Fax]
FROM [dbo].[Customers]

WHERE
(    @CONDITION = 'AND' /* SCELTA UTENTE AND */
        AND
        (([ContactName] LIKE '%' + @NAME + '%' OR @NAME IS NULL /* FILTRO NULLO */)
                AND
        ([Address] LIKE '%' + @ADDRESS + '%' OR  @ADDRESS IS NULL /* FILTRO NULLO */)
            /*  AND .... ALTRO FILTRO */
        )
)
  OR
(    @CONDITION = 'OR' /* SCELTA UTENTE OR */
        AND
        (([ContactName] = @NAME OR @NAME IS NULL /* FILTRO NULLO */)
                OR
        ([Address] LIKE '%' + @ADDRESS + '%' OR  @ADDRESS IS NULL /* FILTRO NULLO */)
            /*  OR .... ALTRO FILTRO */
        )
)

Con questa metodologia si possono gestire anche i filtri nullable annullando la condizione di ricerca AND con la condizione OR @parametro ISNULL.

Enjoy snippet!!

31 marzo 2010 @ 09:11

No comments yet.

Leave a comment

Leave a Reply

Are you human? Time limit is exhausted. Please reload CAPTCHA.