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.

War es hilfreich?

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).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit dba.stackexchange
scroll top