Domanda

Ho una tabella con un numero di campi in esso. Sto cercando di creare filtro di ricerca in asp.net modo che l'utente può cercare da uno o una combinazione di campi. Quindi, fondamentalmente voglio creare un unico stored procedure che accetta in 4 params ed aggiungerà il parametro alla clausola WHERE se non nullo ...

TableExample dispone di 4 colonne, Col1 Col2 Col3 Col4

Sto sperando che ci sia modo di fare questo con un unico stored procedure, invece di dover creare una per ogni possibile combinazione.

Stavo cercando qualcosa di simile, che non è corretto, ma la sua cosa Ive ha ottenuto finora.

GRAZIE!

CREATE PROCEDURE [dbo].[Search]
    @Col1 int,
    @Col2 int,
    @Col3 int,
    @Col4 int
AS

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SELECT *

FROM
    [dbo].[TestTable]
WHERE
    1=1
    CASE        
        WHEN @Col1 IN NOT NULL
        THEN AND [Col1] = @Col1

        WHEN @Col2 IN NOT NULL
        THEN AND [Col2] = @Col2

        WHEN @Col3 IN NOT NULL
        THEN AND [Col3] = @Col3

        WHEN @Col4 IN NOT NULL
        THEN AND [Col4] = @Col4
    END
È stato utile?

Soluzione 5

Vi ringrazio tutti per le vostre risposte. Tuttavia, ho fatto un po 'diverso. Spero che aiuta qualcuno! Ecco come sono andato su di esso:

CREATE PROCEDURE [dbo].[TestTable_Search]
    @Col1 int,
    @Col2 uniqueidentifier,
    @Col3 datetime,
    @Col4 datetime
AS

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SELECT *

FROM
    [dbo].[TestTable]
WHERE
    [Col1] = COALESCE(@Col1, Col1) AND
    [Col2] = COALESCE(@Col2, Col2) AND
    [Col3] >= COALESCE(@Col3 + "00:00:00", Col3) AND
    [Col4] <= COALESCE(@Col4 + "23:59:59", Col4)

Altri suggerimenti

Con il fatto che o cortocircuiti. Ho pensato -1 non è un valore valido.

CREATE PROCEDURE [dbo].[Search]
    @Col1 int = -1,
    @Col2 int = -1,
    @Col3 int = -1,
    @Col4 int = -1
AS
Begin
SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SELECT *

FROM
    [dbo].[TestTable]
WHERE
 (@Col1 = -1 OR [Col1] = @Col1)
and
(@Col2 = -1 OR [Col2] = @Col2)
and
(@Col3 = -1 OR [Col3] = @Col3)
and
(@Col4 = -1 OR [Col4] = @Col4)



END

di ricerca è una delle opzioni rari predico utilizzando sia SQL dinamico o costruire la stringa SQL nel codice. se si dispone di un ambiente tutto sproc utilizzare SQL dinamico nella vostra sProc. parametrizzare e utilizzare sp_executesql a correre per evitare di SQL Injection

È possibile farlo con un metodo simile a quello che hai:

WHERE
  CASE
    WHEN @Col1 IS NULL THEN true
    ELSE [Col1] = @Col1
  END
AND
  CASE
    WHEN @Col2 IS NULL THEN true
    ELSE [Col2] = @Col2
  END
...

In alternativa si può rendere molto più semplice, anche se forse meno leggibile:

WHERE (@Col1 IS NULL OR [Col1] = @Col1])
  AND (@Col2 IS NULL OR [Col2] = @Col2])
  AND ...

Dovreste usare SQL dinamico per farlo:

CREATE PROCEDURE [dbo].[Search]
    @Col1 int,
    @Col2 int,
    @Col3 int,
    @Col4 int
AS

DECLARE @SQL nvarchar(MAX)

SET TRANSACTION ISOLATION LEVEL READ COMMITTED

SET @SQL = 'SELECT * 
              FROM [dbo].[TestTable]
             WHERE 1=1 '

IF @Col1 IS NOT NULL
SET @SQL = @SQL + ' AND Col1 = ''' + @Col1 + ''' '

IF @Col2 IS NOT NULL
SET @SQL = @SQL + ' AND Col2 = ''' + @Col2 + ''' '

IF @Col3 IS NOT NULL
SET @SQL = @SQL + ' AND Col3 = ''' + @Col3 + ''' '

IF @Col4 IS NOT NULL
SET @SQL = @SQL + ' AND Col4 = ''' + @Col4 + ''' '

exec sp_executesql @SQL

END

Tenete a mente che ci sono pericoli per questo, tra cui SQL injection, così come una serie di altri problemi di autorizzazioni che possono sorgere, dal momento che è SQL dinamico, ma è l'unico modo per ottenere questo risultato nel livello di database. Se si vuole costruire si esegue una query a livello di applicazione (in C #), è possibile difendersi contro gli attacchi SQL injection molto più a fondo.

Alcuni link SQL dinamiche che potrebbero aiutare a capire gli svantaggi:

http://www.sommarskog.se/dynamic_sql.html http: //slashstar.com/blogs/tim/archive/2006/10/12/The-Prevalence-and-Dangers-of-SQL-Injection.aspx

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top