2012-09-13 13 views
5

Używanie menedżera serwera Microsoft SQL 2008.Procedura składowana SQL przekazująca parametr do "zamówienia"

Tworzenie procedury składowanej, która "ostatecznie" wybierze 10 pierwszych na liście Pareto. Ale chciałbym również uruchomić to ponownie, aby znaleźć dolne 10.

Teraz, zamiast powtarzania zapytania na nowo, próbuję sprawdzić, czy istnieje sposób przekazania parametru do zapytania, które ulegnie zmianie kolejność od asc do desc.

Czy jest jakiś sposób na zrobienie tego, co uratuje mnie przed replikowaniem kodu?

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

Jakim typem danych jest "Pareto"? – podiluska

Odpowiedz

7

Tylko będąc nieco głupie:

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 

ty nie ściśle potrzeby umieszczania drugiego warunku sortowania w wyrażeniu CASE w ogóle (*), a jeśli numer Pareto jest numeryczny, możesz zdecydować, że chcesz po prostu wykonać CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto

(*) Drugi warunek sortowania działa tylko wtedy, gdy pierwszy warunek sortowania traktuje dwa wiersze jako równe. Jest to możliwe, gdy oba wiersze mają taką samą wartość Pareto Pareto (więc sortowanie odwrotne również uznałoby je za równe), ponieważ pierwsze wyrażenie CASE powraca NULL s (więc @orderby nie jest 'ASC', więc chcemy wykonać DESC . sort


można też rozważyć zdobycie obu zestawów wyników za jednym razem, zamiast robić dwa połączenia:

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 

to daje górną 10 i dolną 10, w celu od góry do dołu. Ale jeśli w sumie jest mniej niż 20 wyników, w przeciwieństwie do obecnego planu nie otrzymasz duplikatów.

+0

Doskonała odpowiedź, dzięki za pomoc, działa bardzo ładnie – lemunk

+0

@Damien_The_Unbeliever dlaczego mówisz, że to "trochę głupio"? – BritishDeveloper

1

try:

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 
Powiązane problemy