Sie können Ihre Anforderung in übersetzen:
SELECT route_id [ROUTE_ID]
FROM route_master(NOLOCK)
WHERE route_ou = 2
AND (@l_s_query is null OR route_query = @l_s_query)
AND lang_id = 1
OPTION (RECOMPILE)
Die OPTION (RECOMPILE)
optional ist, aber auf Kosten der zusätzlichen Übersetzungszeit besser Ausführungspläne geben als Dynamic Search Conditions in T‑SQL
in dem kanonischen Artikel zum Thema diskutiert oder
WHERE route_ou = 2
AND COALESCE(@l_s_query,route_query) = route_query
AND lang_id = 1
: mit COALESCE()
die OR
zu vermeiden Hinweis: Wie @jarlh sagte, wenn route_query
Nullable ist, kann dies einige Probleme wegen Null-Vergleich verursachen, so dass Sie die erste Abfrage verwenden möchten.
Eine weitere Möglichkeit ist das zwei separate Abfragen UNION ALL
, eine für jeden Zustand mit -
SELECT .. FROM ..
WHERE @l_s_query IS NULL
UNION ALL
SELECT .. FROM ..
WHERE @l_s_query = route_query
Auf Bezug auf Leistung, nur die letzte den Index verwenden, glaube ich, die erste der schnellste sein wird
AND ((0 = len(@l_s_query) OR @l_s_query IS NULL OR route_query = @l_s_query)
ERKLÄRUNGEN:, aber es kann depanding auf die Indizes, Größen der Tabellen ETC ..
Vielleicht '... AND (route_query = @l_s_query OR @l_s_query IS NULL) ...'? – jarlh
fügen Sie dieses 'AND hinzu (@l_s_query IS NULL ODER route_query = @l_s_query)' –
Mögliches Duplikat von [verwenden Sie optionalen Parameter in der WHERE-Klausel] (http://stackoverflow.com/questions/10814893/use-optional-parameter-in- where-clause) –