SSRS: modifica dinamica dell'istruzione SQL
-
02-07-2019 - |
Domanda
Ho un rapporto in SSRS 2005 basato su una query simile a questa:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'
Devo essere in grado di includere dinamicamente la parte AND della clausola WHERE nella query in base al fatto che l'utente abbia selezionato una casella di controllo. Fondamentalmente, questa è un'istruzione SQL dinamica e questo è il problema. Ho provato diversi approcci senza risultati. È possibile? SSRS 2005 supporta SQL dinamico? Grazie!
Soluzione
Charles aveva quasi la risposta corretta.
Dovrebbe essere:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked = 0 OR col2 LIKE '%XYZ%')
Questo è un classico "pattern" in SQL per predicati condizionali. Se @checked = 0
, restituirà tutte le righe corrispondenti al resto del predicato ( col1 = 'ABC'
). SQL Server non elaborerà nemmeno la seconda metà di OR
.
Se @checked = 1
valuterà la seconda parte di OR
e restituirà le righe corrispondenti a col1 = 'ABC' AND col2 LIKE '% XYZ % '
Se si hanno più predicati condizionali, questi possono essere concatenati usando questo metodo (mentre i metodi IF e CASE diventerebbero rapidamente ingestibili).
Ad esempio:
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
AND (@checked2 = 0 OR col3 LIKE '%MNO%')
Non usare SQL dinamico, non usare IF o CASE.
Altri suggerimenti
Che ne dici di questo. @checked è la tua variabile bit.
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')
Modifica: Inoltre, se non stai usando un proc memorizzato, allora usa uno.
Forse questo funzionerebbe per te:
if @checked = 1
select * from mytable (nolock) where col = 'ABC'
else
select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'
Mi dispiace non usare molto SSRS, ma se riesci a ottenere il valore della casella di controllo nel parametro @checked dovrebbe funzionare.
In alternativa puoi usare un'istruzione CASE WHEN.
SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END
Funzionerebbe in SSRS 2000 ma verrà usato come ultima risorsa.
(cattivo) PSEUDOCODE
="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")
Dai un'occhiata a Esecuzione " dinamica " Query SQL . dalla Guida per autostoppisti a SQL Server 2000 Reporting Services
Un modo per farlo è generare la query SSRS come espressione. Nel designer di report BIDS, imposta la query in questo modo:
="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")
se puoi usare le stored procedure, è probabilmente più facile farlo lì. passa i tuoi parametri. Crea una stringa SQL in base alle tue condizioni ed esegui un EXEC sulla stringa sql, il tuo proc memorizzato restituirà i risultati di cui hai bisogno.
Puoi anche adottare un altro approccio e utilizzare la funzione Exec:
DECLARE @CommonSelectText varchar(2000)
DECLARE @CompleteSelectText varchar(2000)
SELECT @CommonSelectText = 'SELECT * FROM MyTable (nolock) Where Col = ''ABC'' '
IF @checked = 1
SELECT @CompleteSelectText = @CommonSelectText + ' AND ColW LIKE ''%XYZ%'' '
ELSE
SELECT @CompleteSelectText = @CommonSelectText
EXEC (@CompleteSelectText)
GO
Nota l'uso di due apostrofi '
per contrassegnare il testo tra virgolette.