2017-02-22 2 views
0

Ich habe die folgende Beispielabfrage innerhalb einer gespeicherten Prozedur, bei der die Parameter @StartDate, @EndDate und @ClientID optional sind.Verwenden von optionalen Parametern in Where-Klausel

Was ist der beste Weg, um das in der Abfrage zu behandeln, um sicherzustellen, dass ich ein Ergebnis je nachdem, ob 1 oder viele Parameter Werte haben?

select * from table 
WHERE 
    StartDate >= @StartDate and 
    StartDate <= @EndDate and 
    CE.ClientID = @ClientID 

Zum Beispiel könnte jemand nur ein Startdatum eingeben oder einfach nur ein Enddatum eingeben oder eine bestimmte ClientID auswählen oder eine Kombination aller Sie 3.

+2

Die beste Referenz, IMO, wird Erland Sommarskog der [dynamische Suchbedingungen in T-SQL] (http://www.sommarskog.se/dyn-search.html) –

Antwort

1

Wenn Sie bei jeder Ausführung nur wenig Zeit opfern möchten, bietet OPTION(RECOMPILE) die gleiche Leistung wie dynamisches SQL, jedoch ohne alle Gefahren.

select * from table 
WHERE 
    (StartDate >= @StartDate or @StartDate is null) and 
    (StartDate <= @EndDate or @EndDate is null) and 
    (CE.ClientID = @ClientID or @ClientID is null) 
option(recompile) 
+0

Dank Dekan, scheint diese Lösung die beste basierend auf der Leichtigkeit davon. – Philip

1

tut so etwas tun können -

SELECT * FROM table 
WHERE 
    (@StartDate IS NULL OR StartDate >= @StartDate) AND 
    (@EndDate IS NULL OR StartDate <= @EndDate) AND 
    (@ClientID IS NULL OR CE.ClientID = @ClientID) 
1

Der beste Weg ist, dynamisches SQL zu verwenden. Etwas wie folgt aus:

declare @sql nvarchar(max); 
set @sql = 'select * from table'; 

declare @where nvarchar(max); 

set @where = (case when @StartDate is not null then ' and StartDate >= @StartDate' else '' end) + 
      (case when @EndDate is not null then ' and EndDate >= @EndDate' else '' end) + 
      (case when @ClientID is not null then ' and ClientID = @ClientID' else '' end); 

set @where = stuff(@where, 1, 5, ''); 

set @sql = @sql + (case when len(@where) > 0 then ' where ' + @where' else ''); 

exec sp_executesql @sql, 
        N'@StartDate date, @EndDate date, @ClientId int', 
        @StartDate = @StartDate, @EndDate = @EndDate, @ClientId = ClientId; 

Der Grund, warum dies besser ist, weil jede mögliche Kombination der Eingänge Ergebnisse in einer anderen Abfrage. SQL Server kann die Abfragen mithilfe geeigneter Indizes optimieren. Diese Optimierung kann bei Verwendung optionaler Parameter wichtig sein.

Verwandte Themen