Voglio utilizzare per dinamicamente TOP o no un po 'come questo ...È possibile una clausola TOP condizionale T-SQL?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
Voglio utilizzare per dinamicamente TOP o no un po 'come questo ...È possibile una clausola TOP condizionale T-SQL?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
ho appena usato qualcosa di simile: -
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
non credo che questo è possibile perché TOP
viene applicato non solo su una colonna, ma l'intera riga. Dovresti creare due diverse istruzioni select e inserirle in un costrutto IF ELSE
.
La risposta breve è no, non il modo in cui ce l'hai.
È possibile comunque utilizzare IF
per testare ed eseguire una query diversa:
IF (@SomeNumber = 0)
BEGIN
SELECT TOP 5 ColumnName FROM Table
END
ELSE
BEGIN
SELECT ColumnName FROM Table
END
due opzioni: SQL condizionato o SQL dinamico.
(1) condizionale:
IF @SomeNumber = 0
SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
SELECT COLUMNAME FROM TABLE
(2) dinamico: costruire la query in un varchar() e passarlo a sp_execute
non credo che puoi.
Si potrebbe usare sia SQL dinamico:
Declare @int int
set @int = 10
exec ('Select top ' + @int + ' * From Customers')
Oppure si potrebbe impostare rowcount
if (@someNumber != 0)
begin
set rowcount 5
end
select * From Customers
set rowcount 0
spero di aver capito il problema: che si desidera selezionare la TOP 5 righe se si passa @ SomeNumber = 0 else seleziona tutte le righe etable
Come prima implementazione diritta puoi fare qualcosa del genere
declare @SomeNumber as int
set @SomeNumber = 5
-- set @SomeNumber = 1
SELECT TOP (SELECT @SomeNumber) COLUMNNAME FROM MYTABLE
è possibile modificare il valore del parametro in modo da avere quante righe si desidera
Altrimenti vi suggerisco di implementare una stored procedure (e magari avete già fatto che, in caso contrario è possibile seguire la prossimi passi al fine di farlo)
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
quindi è possibile chiamare
exec [dbo].[TOPCLAUSE] 0
exec [dbo].[TOPCLAUSE] 1
Probabilmente non risposto alla tua domanda, ma fatemi sapere se ti ha aiutato
SELECT TOP (SELECT @SomeNumber) è perfetto. – BClaydon
Un'altra scappatoia: fare uso di subquery di con la funzione row_number
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))
Mentre la dichiarazione per quanto riguarda superiore applicando a tutta una fila non una colonna è corretto, questo può essere raggiunto! vedi la risposta di SPE109! – OneSHOT