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!

È stato utile?

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.

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