2010-06-24 6 views

Antwort

2

Ich habe so etwas wie dies gerade verwendet: -

Declare @SQL nvarchar(max), @Params nvarchar(max) 
set @Params = N'' 
Set @SQL = N'SELECT ' + Cast(@SomeNumber as varchar) + ' CASE WHERE 0 THEN TOP 5 COLUMNNAME 
         ELSE COLUMNNAME 
        END 
FROM TABLE' 

exec sp_executesql @SQL, @Params 
0

Ich glaube nicht, dass dies möglich ist, weil TOP auf nicht nur eine Säule aufgetragen wird, sondern die ganze Reihe. Sie müssten zwei verschiedene Select-Anweisungen erstellen und sie in ein IF ELSE Konstrukt setzen.

+0

Während die Aussage in Bezug auf oben auf eine ganze Reihe Anwendung Verwendung von Unterabfragen der mit row_number Funktion macht nicht eine Spalte richtig, das kann erreicht werden! Siehe SPE109's Antwort! – OneSHOT

1

Kurze Antwort ist nein, nicht die Art, wie Sie es haben.

Sie können jedoch IF verwenden, um eine andere Abfrage zu testen und auszuführen:

IF (@SomeNumber = 0) 
BEGIN 
    SELECT TOP 5 ColumnName FROM Table 
END 
ELSE 
BEGIN 
    SELECT ColumnName FROM Table 
END 
1

zwei Optionen: bedingte SQL oder dynamische SQL.

(1) Bedingung:

IF @SomeNumber = 0 
    SELECT TOP 5 COLUMNAME FROM TABLE 
ELSE 
    SELECT COLUMNAME FROM TABLE 

(2) Dynamisch: die Abfrage in einer varchar aufzubauen() und übergeben es

Sp_execute
4

Ich glaube nicht, Sie können.

Sie entweder dynamische SQL verwenden:

Declare @int int 

set @int = 10 

exec ('Select top ' + @int + ' * From Customers') 

Oder Sie rowcount

if (@someNumber != 0) 
begin 
set rowcount 5 
end 

select * From Customers 

set rowcount 0 
17

Ich hoffe, Ihr Problem zu haben verstanden, setzen könnte: Sie die Top-5 Zeilen auswählen möchten, wenn Sie pass @ SomeNumber = 0 sonst wählen Sie alle diese Zeilen aus

Als erste direkte Implementierung können Sie so etwas tun

declare @SomeNumber as int 

set @SomeNumber = 5 
-- set @SomeNumber = 1 

SELECT TOP (SELECT @SomeNumber) COLUMNNAME FROM MYTABLE 

können Sie den Parameterwert, um wie viele haben ändern Reihen Sie


Ansonsten möchte ich vorschlagen, dass Sie eine gespeicherte Prozedur zu implementieren (und vielleicht haben Sie schon, dass, sonst hat man die folgen die nächsten Schritte, um es zu tun)

CREATE procedure [dbo].[TOPCLAUSE] 

    -- clause parameter 
    @SomeNumber as integer 

AS 

IF @SomeNumber = 0 
BEGIN 
    SELECT TOP 5 COLUMNNAME FROM MYTABLE 
END 
ELSE 
BEGIN 
    SELECT COLUMNNAME FROM MYTABLE 
END 

GO 

Dann können Sie

exec [dbo].[TOPCLAUSE] 0 

exec [dbo].[TOPCLAUSE] 1 
anrufen

ich wahrscheinlich Ihre Frage nicht beantwortet, aber lassen Sie mich wissen, wenn es Ihnen

+1

SELECT TOP (SELECT @SomeNumber) ist perfekt. – BClaydon

1

Einen weiterer Schlupfloch hilft:

DECLARE @DoTopJN AS bit 

SET @DoTopJN = 0 -- or 1 

SELECT X.Sequence 
     X.COLUMNA 
     --etc 

FROM (SELECT ROW_NUMBER() OVER (ORDER BY Y.Code) AS Sequence 
      ,Y.COLUMNA 
      ,Y.COLUMNB 
      -- etc. 
     FROM Y) X 

WHERE ((@DoTopJN = 0) OR (X.Sequence = 1)) 
Verwandte Themen