Я хочу динамично использовать TOP или не вид подобных это...
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
Не думаю, что ты сможешь.
Вы можете использовать динамический 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
Надеюсь, я понял вашу проблему: вы хотите выбрать TOP 5 строк, если передать @SomeNumber = 0, иначе выбрать все строки таблицы
В качестве первой прямой реализации вы можете сделать что-то вроде этого
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
Возможно, я не ответил на ваш вопрос, но дайте мне знать, если это помогло вам
Два варианта: условный SQL или динамический SQL.
(1) Условный:
IF @SomeNumber = 0
SELECT TOP 5 COLUMNAME FROM TABLE
ELSE
SELECT COLUMNAME FROM TABLE
(2) Динамический: строим запрос в varchar() и передаем его в sp_execute
Я не думаю, что это возможно, потому что TOP
применяется не только к столбцу, но и ко всей строке. Вам придется создать два разных оператора select и поместить их в конструкцию IF ELSE
.
Короткий ответ - нет, не так, как у вас.
Однако вы можете использовать IF
для проверки и выполнения другого запроса:
IF (@SomeNumber = 0)
BEGIN
SELECT TOP 5 ColumnName FROM Table
END
ELSE
BEGIN
SELECT ColumnName FROM Table
END