Frage

Ich habe einen Bericht in SSRS 2005, die auf einer Abfrage basiert, die auf diese eine ähnlich ist:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE '%XYZ%'

Ich muß in der Lage sein, dynamisch die UND Teil der WHERE-Klausel in der Abfrage basierend darauf, ob der Benutzer ein Kontrollkästchen aktiviert ist. Im Grunde ist dies eine dynamische SQL-Anweisung und das ist das Problem. Ich habe versucht, mehrere Ansätze ohne Erfolg. Ist das möglich? Does SSRS 2005 unterstützt dynamische SQL? Dank!

War es hilfreich?

Lösung

Charles hatte fast die richtige Antwort.

Es sollte sein:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
   AND (@checked = 0 OR col2 LIKE '%XYZ%')

Dies ist ein klassisches „Muster“ in SQL für die bedingten Prädikate. Wenn @checked = 0, dann wird es alle Zeilen zurückgeben, den Rest des Prädikats (col1 = 'ABC') entsprechen. SQL Server wird nicht einmal die zweite Hälfte des OR verarbeiten.

Wenn @checked = 1 dann wird es den zweiten Teil des OR auswerten und Rück Reihen passende col1 = 'ABC' AND col2 LIKE '%XYZ%'

Wenn Sie mehr bedingten Prädikate sie verkettet werden können zusammen mit dieser Methode (während der IF und CASE Methoden schnell unhandlich werden würden).

Zum Beispiel:

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
    AND (@checked1 = 0 OR col2 LIKE '%XYZ%')
    AND (@checked2 = 0 OR col3 LIKE '%MNO%')

nicht dynamischen SQL Verwenden Sie, nicht IF oder CASE verwenden.

Andere Tipps

Wie wäre es diese. @checked ist Ihre Bit-Variable.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND (@checked <> 0 and col2 LIKE '%XYZ%')

Edit: Auch wenn Sie nicht eine gespeicherte Prozedur verwenden, dann ein verwenden

.

Vielleicht wäre dies für Sie arbeitet:

if @checked = 1
    select * from mytable (nolock) where col = 'ABC'
else
    select * from mytable (nolock) where col = 'ABC' AND colw Like '%XYZ%'

Es tut mir leid ich SSRS nicht viel, aber wenn man den Wert der Checkbox in den @checked Parameter erhalten kann, sollte dies funktionieren.

Alternativ könnten Sie ein CASE WHEN-Anweisung verwenden.

SELECT * FROM MyTable (NOLOCK) 
WHERE col1 = 'ABC'
AND col2 LIKE CASE @checked WHEN 1 THEN '%XYZ%' ELSE col2 END

Dies würde in SSRS 2000 arbeiten, aber als letztes Mittel eingesetzt.

(sehr schlecht) Pseudo-Code

="SELECT * FROM MyTable (NOLOCK)
WHERE col1 = 'ABC'"+
iff(condition,true,"AND col2 LIKE '%XYZ%'","")

Check out Ausführen "Dynamic" SQL-Abfragen . von Per Anhalter auf SQL Server 2000 Reporting Services

Eine Möglichkeit, dies zu tun ist durch die SSRS-Abfrage als Ausdruck zu erzeugen. Im BIDS Report-Designer, stellen Sie Ihre Abfrage nach oben wie folgt:

="SELECT * FROM MyTable WITH (NOLOCK) WHERE col1 = 'ABC'" +
 Iif(Parameters!Checked.Value = true," AND col2 LIKE '%XYZ%'","")

Wenn Sie gespeicherte Prozeduren verwenden können, ist es wahrscheinlich einfacher, es zu tun gibt. Pass in Ihrem params. Erstellen Sie eine SQL-Zeichenfolge auf der Grundlage Ihrer Bedingungen und tun eine EXEC auf die SQL-Zeichenfolge, Ihre gespeicherte Prozedur werden die Ergebnisse angezeigt Sie benötigen.

Sie können auch einen anderen Ansatz und die Exec-Funktion:

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  

Beachten Sie die Verwendung von zwei Apostrophe ' den zitierten Text zu markieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top