2010-12-23 15 views
1

Ich möchte eine gespeicherte Prozedur erstellen, die ganzzahlige Werte als @top von mir nimmt, so dass ich es in meiner Abfrage verwenden kann, aber es mir nicht erlaubt, Wert von oben dynamisch festzulegen.Nehmen Sie die obere Zählung dynamisch

select top @top * from (select url, 
count(1) as shared from tblshared 
group by url, uniqid having 
uniqid = @uniqid) as sha order by 
shared desc 

möchte ich oben n Sätze aus der Tabelle abzurufen, damit ich den Wert von n in gespeicherte Prozedur übergeben wollen, und es wird mir die Anzahl der Top-Datensätze zurück.

Hinweis: Ich möchte nicht exec verwenden.

Danke.

+0

Welche Version von SQL Server? –

+0

@ using sql server 2005 –

Antwort

1

könnten Sie verwenden SET ROWCOUNT:

SET ROWCOUNT @top 
SELECT ... 
SET ROWCOUNT 0 
+1

-1 Dies gilt für Zwischenergebnisse. So Aggregate und Unterabfragen können * falsch *. TOP gilt wie erwartet – gbn

0
declare @v1 int 
set @v1 = 25 
set rowcount @v1 
select * from MyTable Order by DateColumn 
set rowcount 0 
+1

-1 Dies gilt für Zwischenergebnisse. So können Aggregate und Unterabfragen falsch sein. TOP gilt wie erwartet – gbn

4

, dass feine funktioniert, wenn Sie in Klammern wickeln @top

select top (@top) * 
from ( 
    select url, count(1) as shared 
    from tblshared 
    group by url, uniqid 
    having [email protected]) as sha 
order by shared desc 
+0

Erhalte diesen Fehler: Msg 170, Ebene 15, Status 1, Zeile 1 Zeile 1: Falsche Syntax in der Nähe von '('. It zeigt Fehler an '(' –

+0

) Versuche, den obersten Satz vollständig zu entfernen run ohne es, fehlgeschlagen, dass welche Version von sqlserver verwenden Sie? – Robb

+0

Ich benutze SQL Server 2005 –

2

Sie ROW_NUMBER() isntead von oben

können
with t1 as(
    select url,row_number() over(
       partition by url, uniqid order by url, uniqid desc) as shared 
    from tblshared 
    where uniqid = @uniqid) 

select * from t1 where shared < @top 

REF

Verwandte Themen