2012-09-13 3 views
5

Utilizzo di Microsoft SQL server manager 2008.SQL stored procedure che passa parametro in "order by"

Esecuzione di una procedura memorizzata che "alla fine" selezionerà i primi 10 nell'elenco di Pareto. Ma vorrei anche eseguirlo di nuovo per trovare il 10 in basso.

Ora, invece di replicare la query tutto da capo, sto cercando di vedere se c'è un modo per passare un parametro nella query che cambierà l'ordine da asc a desc.

C'è un modo per fare ciò che mi salverà dal codice di replica?

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto @orderby 
+0

Quale tipo di dati è "Pareto"? – podiluska

risposta

7

Solo essendo un po 'sciocco:

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto 
ORDER by CASE WHEN @orderby='ASC' THEN Pareto END, 
     CASE WHEN @orderby='DESC' THEN Pareto END DESC 

Non lo sai strettamente necessità di mettere la seconda condizione di ordinamento in un'espressione CASE a tutti (*), e se Pareto è numerico, si può decidere di fare solo CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto

(*) La seconda condizione di ordinamento ha solo un effetto quando la prima condizione di ordinamento considera due righe uguali. Questo è sia quando i due righe hanno lo stesso Pareto valore (pertanto l'ordinamento inverso sarebbe anche considerare uguali), del perché il primo CASE espressione restituisce NULL s (così @orderby non è 'ASC', quindi vogliamo eseguire la DESC . sorta


si potrebbe anche prendere in considerazione il recupero di entrambi i set di risultati in un colpo solo, piuttosto che fare due chiamate:

CREATE PROCEDURE [dbo].[TopVRM] 
@orderby varchar(255) 
AS 

SELECT * FROM (
    SELECT 
     *, 
     ROW_NUMBER() OVER (ORDER BY Pareto) as rn1, 
     ROW_NUMBER() OVER (ORDER BY Pareto DESC) as rn2 
    FROM (
     SELECT Peroid1.Pareto 
     FROM dbo.Peroid1 
     GROUP by Pareto 
    ) t 
) t2 
WHERE rn1 between 1 and 10 or rn2 between 1 and 10 
ORDER BY rn1 

Questo vi darà la top 10 e il fondo 10, al fine da cima a fondo. Ma se ci sono meno di 20 risultati in totale, non otterrai duplicati, a differenza del tuo piano attuale.

+0

ottima risposta, grazie per l'aiuto, funziona molto bene – lemunk

+0

@Damien_The_Unbeliever perché dici che questo è "un po 'sciocco"? – BritishDeveloper

1

prova:

CREATE PROCEDURE [dbo].[TopVRM] 
(@orderby varchar(255) 
AS 
IF @orderby='asc' 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto asc 
ELSE 
SELECT Peroid1.Pareto FROM dbo.Peroid1 
GROUP by Pareto ORDER by Pareto desc