Schalten Sie die obere Klausel zwischen Prozentsatz und Zeilen nach Parameter um
-
16-10-2019 - |
Frage
Für einen Bericht mache ich Abfragen, bei denen die Benutzer annehmen, dass sie Top -Werte basierend auf der Wahrung oder der Behebung von Zeilen aussuchen müssen.
Ich habe zwei Ideen
Aufrufen von zwei verschiedenen sub gespeicherten Prozeduren basierend auf bestandenem Param.
if @param ='percent'
begin
exec sp_data_TOP_by_Percent
end
if @param ='perRow'
begin
exec sp_data_TOP_by_PerRow
end
Eine andere Idee ist es, so etwas dynamisches TSQL -Abfrage zu machen
declare @command nchar(max)
select @command = 'select top(10) '
+ case @param
when 'percent' then percent
else ' '
end
+ ' * '
+ 'from table
order by 1';
exec sp_executesql @command
Gibt es eine dritte Lösung für so etwas?
Was ist ein besserer Ansatz? Erstens, um dynamische TSQL zu vermeiden, ist jedoch schwieriger, den Code an zwei Stellen zu verwalten. Ich verwende MSSQL2005 als Datenbank.
Lösung
Ich hätte 2 separate Abfragen/gespeicherte Verfahren, um dynamische SQL zu vermeiden.
Eine IF -Aussage in einem gespeicherten Proc wäre ebenfalls ausreichend
Andere Tipps
Aufwenden GBNs Antwort, Zwei gespeicherte Verfahren sind der bessere Weg, um hierher zu gehen. Außerdem würde ich noch einen Schritt weiter gehen und die Abfrage (ohne Sans) platzieren top
Klausel) in a Funktionsfunktion und dann haben die gespeicherten Verfahren nichts anderes als eine Shell, die den TVF aufruft und die anwendet top
Klausel angemessen (nach Anzahl der Zeilen oder Prozent).
Die einzige Einschränkung hier ist, dass wenn Sie ein TVF verwenden Eingelieferte TVF, da der Abfrageanalysator Statistiken verwenden kann (ähnlich wie es eine Ansicht wäre).