Я хочу, чтобы динамически использовать TOP или нет вроде этого ...Возможно ли условное предложение TOP T-SQL?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
Я хочу, чтобы динамически использовать TOP или нет вроде этого ...Возможно ли условное предложение TOP T-SQL?
SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
ELSE COLUMNNAME
END
FROM TABLE
Я просто использовал что-то вроде этого: -
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
Я не думаю, что это возможно, потому что TOP
применяется на не только колонку, но и весь ряд. Вам нужно будет создать два разных оператора select и поместить их в конструкцию IF ELSE
.
Короткий ответ - нет, не так, как у вас есть.
Однако вы можете использовать IF
для тестирования и запуска другого запроса:
IF (@SomeNumber = 0)
BEGIN
SELECT TOP 5 ColumnName FROM Table
END
ELSE
BEGIN
SELECT ColumnName FROM Table
END
два варианта: условно SQL или динамический SQL.
(1) Условный:
IF @SomeNumber = 0
SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
SELECT COLUMNAME FROM TABLE
(2) Динамический: создать запрос в VARCHAR() и передать его в sp_execute
Я не думаю, что вы можете.
Вы можете либо использовать динамический SQL:
Declare @int int
set @int = 10
exec ('Select top ' + @int + ' * From Customers')
Или вы могли бы установить rowcount
if (@someNumber != 0)
begin
set rowcount 5
end
select * From Customers
set rowcount 0
Я надеюсь, понял вашу проблему: вы хотите, чтобы выбрать ТОП 5 строк, если вы передаете @ SomeNumber = 0 else select all thableable rows
В качестве первой прямой реализации вы можете сделать что-то подобное
declare @SomeNumber as int
set @SomeNumber = 5
-- set @SomeNumber = 1
SELECT TOP (SELECT @SomeNumber) COLUMNNAME FROM MYTABLE
вы можете изменить значение параметра, чтобы иметь сколько строк вы хотите
В противном случае я предлагаю вам реализовать хранимую процедуру (и, возможно, вы уже сделали это, в противном случае вы можете следовать следующие шаги для того, чтобы сделать это)
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
Тогда вы можете позвонить
exec [dbo].[TOPCLAUSE] 0
exec [dbo].[TOPCLAUSE] 1
я, вероятно, не ответил на ваш вопрос, но дайте мне знать, если это поможет вам
SELECT TOP (SELECT @SomeNumber) идеально подходит. – BClaydon
Другой лазейку: использовать подзапрос с функцией 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))
Хотя заявление относительно верхней применения к целому ряду не столбец правильно, это может быть достигнуто! см. ответ SPE109! – OneSHOT