Ich mag TOP dynamisch benutzen oder nicht irgendwie so ...Ist eine bedingte T-SQL-TOP-Klausel möglich?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
Ich mag TOP dynamisch benutzen oder nicht irgendwie so ...Ist eine bedingte T-SQL-TOP-Klausel möglich?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
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
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.
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
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_executeIch 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
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
SELECT TOP (SELECT @SomeNumber) ist perfekt. – BClaydon
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))
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