2012-09-13 27 views
5

"eninde sonunda" Pareto listedeki ilk 10 seçecektir bir saklı yordam yapma Microsoft SQL server yöneticisi 2008.SQL saklı yordam geçen parametre

kullanma. Ama aynı zamanda altını bulmak için bunu tekrar çalıştırmak istiyorum.

Şimdi, sorguyu tekrar tekrar çoğaltmak yerine, değişecek sorguya bir parametre iletmenin bir yolu olup olmadığını görmeye çalışıyorum. asc den sora kadar.

Beni çoğaltma kodundan kurtaracak herhangi bir yolu var mı?

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

Hangi veri türü "Pareto"? – podiluska

cevap

7

Sadece biraz saçma kalarak: Bilemezsin

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 

kesinlikle (hiç bir CASE ifadede ikinci sıralama koşulunu koymak gerek *) ve Pareto sayısal ise, yalnızca CASE WHEN @orderby='ASC' THEN 1 ELSE -1 END * Pareto

yapmaya karar verebilirsiniz

(*) İkinci sıralama koşulu, yalnızca birinci sıralama koşulunun iki satırın eşit olacağı düşünüldüğünde bir etkisi vardır. Bu, her iki satır aynı Pareto değere sahip (bu yüzden ters sıralama da eşit bunları dikkate alacağını) ilk CASE ifade NULL s dönüyor nedeniyle, zaman ya (bu yüzden @orderby'ASC' değildir, bu yüzden DESC gerçekleştirmek istediğiniz . sırayla,

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 

Bu, ilk 10 ve alt 10 verecek: sort


Ayrıca tek seferde hem sonuç kümelerini almak yerine iki çağrı yapıyor düşünebilirsiniz baştan aşağı. Ancak toplamda 20'den az sonuç varsa, mevcut planınızdan farklı olarak iki kopya alamazsınız.

+0

mükemmel yanıt, yardım için teşekkürler, çok güzel çalışıyor – lemunk

+0

@Damien_The_Unbeliever neden bu "biraz aptal" diyorsunuz? – BritishDeveloper

1

deneyin:

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 
İlgili konular