Ich erstelle eine gespeicherte Prozedur, um eine Tabelle zu durchsuchen. Ich habe viele verschiedene Suchfelder, die alle optional sind. Gibt es eine Möglichkeit, eine gespeicherte Prozedur zu erstellen, die dies handhabt? Angenommen, ich habe eine Tabelle mit vier Feldern: ID, Vorname, Nachname und Titel. Ich könnte so etwas machen:
CREATE PROCEDURE spDoSearch
@FirstName varchar(25) = null,
@LastName varchar(25) = null,
@Title varchar(25) = null
AS
BEGIN
SELECT ID, FirstName, LastName, Title
FROM tblUsers
WHERE
FirstName = ISNULL(@FirstName, FirstName) AND
LastName = ISNULL(@LastName, LastName) AND
Title = ISNULL(@Title, Title)
END
Diese Art von Arbeiten. Datensätze, bei denen Vorname, Nachname oder Titel NULL sind, werden jedoch ignoriert. Wenn Titel nicht in den Suchparametern angegeben ist, möchte ich Datensätze einschließen, bei denen Titel NULL ist - dasselbe gilt für Vorname und Nachname. Ich weiß, dass ich dies wahrscheinlich mit dynamischem SQL tun könnte, aber ich möchte das vermeiden.
tsql
optional-parameters
Corey Burnett
quelle
quelle
code
folgen : ISNULL (FirstName, ') = ISNULL (@FirstName,' ') - dies macht jede NULL zu einer leeren Zeichenfolge und diese können über Gl. Operator. Wenn Sie alle Titel erhalten möchten, wenn der Eingabeparameter null ist, versuchencode
Sie Folgendes : Vorname = @FirstName ODER @FirstName IST NULL.Antworten:
Das dynamische Ändern von Suchvorgängen basierend auf den angegebenen Parametern ist ein kompliziertes Thema, und es kann, selbst wenn nur ein sehr geringer Unterschied besteht, massive Auswirkungen auf die Leistung haben. Der Schlüssel besteht darin, einen Index zu verwenden, kompakten Code zu ignorieren und sich keine Gedanken über das Wiederholen von Code zu machen. Sie müssen einen guten Plan für die Ausführung von Abfragen erstellen (einen Index verwenden).
Lesen Sie dies und berücksichtigen Sie alle Methoden. Ihre beste Methode hängt von Ihren Parametern, Ihren Daten, Ihrem Schema und Ihrer tatsächlichen Verwendung ab:
Dynamische Suchbedingungen in T-SQL von Erland Sommarskog
Der Fluch und der Segen von Dynamic SQL von Erland Sommarskog
Wenn Sie über die richtige SQL Server 2008-Version (SQL 2008 SP1 CU5 (10.0.2746) und höher) verfügen, können Sie mit diesem kleinen Trick tatsächlich einen Index verwenden:
Fügen Sie
OPTION (RECOMPILE)
Ihrer Abfrage hinzu, siehe Erlands Artikel , und SQL Server löst das ProblemOR
von innen auf,(@LastName IS NULL OR LastName= @LastName)
bevor der Abfrageplan basierend auf den Laufzeitwerten der lokalen Variablen erstellt wird, und es kann ein Index verwendet werden.Dies funktioniert für jede SQL Server-Version (gibt die richtigen Ergebnisse zurück), schließt jedoch nur die OPTION (RECOMPILE) ein, wenn Sie SQL 2008 SP1 CU5 (10.0.2746) und höher verwenden. Die OPTION (RECOMPILE) kompiliert Ihre Abfrage neu, nur die aufgelistete Version kompiliert sie basierend auf den aktuellen Laufzeitwerten der lokalen Variablen neu, wodurch Sie die beste Leistung erzielen. Wenn nicht in dieser Version von SQL Server 2008, lassen Sie diese Zeile einfach weg.
quelle
Die Antwort von @KM ist soweit gut, geht aber einem seiner frühen Ratschläge nicht vollständig nach.
Wenn Sie die beste Leistung erzielen möchten, sollten Sie für jede mögliche Kombination optionaler Kriterien eine maßgeschneiderte Abfrage schreiben. Dies mag extrem klingen, und wenn Sie viele optionale Kriterien haben, ist dies möglicherweise der Fall, aber die Leistung ist häufig ein Kompromiss zwischen Aufwand und Ergebnissen. In der Praxis gibt es möglicherweise einen gemeinsamen Satz von Parameterkombinationen, auf die mit maßgeschneiderten Abfragen abgezielt werden kann, und anschließend eine generische Abfrage (gemäß den anderen Antworten) für alle anderen Kombinationen.
Der Vorteil dieses Ansatzes besteht darin, dass in den allgemeinen Fällen, in denen maßgeschneiderte Abfragen durchgeführt werden, die Abfrage so effizient wie möglich ist - die nicht bereitgestellten Kriterien haben keine Auswirkungen. Außerdem können Indizes und andere Leistungsverbesserungen auf bestimmte maßgeschneiderte Abfragen ausgerichtet werden, anstatt zu versuchen, alle möglichen Situationen zu erfüllen.
quelle
Sie können dies im folgenden Fall tun:
Abhängig von Daten ist es jedoch manchmal besser, dynamische Abfragen zu erstellen und auszuführen.
quelle
Fünf Jahre zu spät zur Party.
Es wird in den bereitgestellten Links der akzeptierten Antwort erwähnt, aber ich denke, es verdient eine explizite Antwort auf SO - dynamisches Erstellen der Abfrage basierend auf den bereitgestellten Parametern. Z.B:
Konfiguration
Verfahren
Verwendung
Vorteile:
Nachteile:
Keine direkte Antwort, sondern im Zusammenhang mit dem Problem, auch bekannt als das große Ganze
Normalerweise schweben diese gespeicherten Filterprozeduren nicht herum, sondern werden von einer Service-Schicht aufgerufen. Dies lässt die Möglichkeit, die Geschäftslogik (Filterung) von SQL auf die Serviceschicht zu verlagern.
Ein Beispiel ist die Verwendung von LINQ2SQL, um die Abfrage basierend auf den bereitgestellten Filtern zu generieren:
Vorteile:
Nachteile:
quelle
Erweitern Sie Ihren
WHERE
Zustand:dh verschiedene Fälle mit booleschen Bedingungen kombinieren.
quelle
Das funktioniert auch:
quelle