Filtro query SQL
-
19-09-2019 - |
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
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