2009-06-01 5 views
0

Ich bin auf der Suche nach einer Art "Best Practice" -Methode, um dieses häufige Szenario anzugehen. Ich denke, die Frage wird am besten mit einem Beispiel gestellt. Nehmen wir folgendes an:Reporting Services/Unterstützung von robusten Filtern

  • Das Ziel ist es, einen Bericht 'Auftragszusammenfassung' zu schreiben, der eine Liste von Aufträgen auf der Grundlage verschiedener Filterkriterien anzeigt.
    • Beispiel: Der Benutzer möchte auf alle Bestellungen zwischen X und Y Daten
    • Beispiel erstellt berichten: Der Benutzer auf alle Bestellungen mit dem Status ‚offen‘
    • Beispiel berichten will: Der Benutzer möchte Bericht über alle von einem anderen Benutzer erzeugt Aufträge XYZ
    • Beispiel: Der Benutzer möchte auf alle Bestellungen zwischen $ 1000 und $ 10000
  • Diese Berichte wahrscheinlich von verschiedenen Seiten gestartet werden berichten, aber vielleicht könnte es eine ' weiter ced suchen‘Seite, die sie aktivieren/deaktivieren Filter und definieren Parameter

  • ich über Berichtsparameter implementiert, um den Bericht

Erstellen eines einzigen Bericht mit all diesen Filter erzeugen möchten verwenden Remote-Bearbeitung erlaubt und Bericht-Filter wird sehr schnell und unzugänglich sehr schnell. Dies führt mich zu der Annahme, dass ich eine einzige gespeicherte Prozedur erstellen sollte, die alle möglichen Filterwerte akzeptiert (und einen NULL, wenn die Ergebnismenge nicht durch den Parameter gefiltert werden sollte).

Stimmen Sie dieser Einschätzung zu?

Wenn ja, bin ich kein TSQL-Experte und hätte gerne allgemeine Hinweise zur Implementierung dieser gespeicherten Prozedur. Bisher habe ich es so mache:

  1. Erstellen Sie eine Tabelle Variable orderID @resultset
  2. Populate zunächst über den ersten Filter @resultset (wählte i starten und stoppen Datum)
  3. Für jeden Filter:
    • Wenn der Filter definiert ist, eine Tabelle mit variabler @tempresultset erstellen und alle Datensätze aus @resultset einzufügen WHERE (Filter anwendbar ist)
    • aus @resultset löschen, einfügen in @resultset wählen orderid aus @tempresultset
  4. Rückkehr der @resultset nachdem alle Filter wurden

angewendet dieses nicht nur das Gefühl, Recht/effizient ... Gibt es einen besseren Weg, dies zu nähern?

Alle anderen Vorschläge oder Ratschläge, wie man dieses allgemeine Problem angehen könnte, würden sehr geschätzt werden. Ich fühle mich etwas verloren auf dem richtigen Weg, um diese Lösung zu implementieren, was wie ein sehr häufiges Problem aussehen sollte.

Antwort

0

Nach einiger forsch ich einen guten Weg gefunden haben, diese optionalen Filter in einer einzigen Select-Anweisung in einer gespeicherten Prozedur zu implementieren:

Es sieht so etwas wie:

SELECT ordernumber FROM orders 
--Filter #1 - based on Parameter #1 
WHERE (@param1 IS NULL) OR (somefield = @param1) 
--Filter #2 - based on Parameter #2 
AND WHERE (@param2 IS NULL) or (somefield2 = @param2) 
--Filter #3 - based on Parameter #3 
AND WHERE (@param3 IS NULL) or (somefield3 = @param3)