Возможно ли условное предложение T-SQL TOP? - PullRequest
9 голосов
/ 24 июня 2010

Я хочу динамически использовать TOP или нет вроде этого ...

SELECT @SomeNumber CASE WHERE 0 THEN TOP 5 COLUMNNAME
                        ELSE COLUMNNAME
                   END
FROM TABLE

Ответы [ 8 ]

17 голосов
/ 24 июня 2010

Я надеюсь, что понял вашу проблему: вы хотите выбрать 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

Я, вероятно, не ответил на ваш вопрос, но дайте мне знать, помог ли он вам

4 голосов
/ 24 июня 2010

Не думаю, что вы можете.

Вы можете использовать динамический 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
2 голосов
/ 24 июня 2010

Я только что использовал что-то вроде этого: -

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
1 голос
/ 24 октября 2016

Еще одна лазейка: используйте подзапросы с функцией 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))  
1 голос
/ 24 июня 2010

Два варианта: условный SQL или динамический SQL.

(1) Условный:

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

(2) Динамический: создайте запрос в varchar () и передайте егоsp_execute

1 голос
/ 24 июня 2010

Короткий ответ - нет, не так, как он есть.

Однако вы можете использовать IF для проверки и запуска другого запроса:

IF (@SomeNumber = 0)
BEGIN
   SELECT TOP 5 ColumnName FROM Table
END
ELSE
BEGIN
   SELECT ColumnName FROM Table
END
0 голосов
/ 27 июля 2018

Чтобы исправить код SPE109:

DECLARE @SomeNumber INT = 0
DECLARE @SQL nvarchar(max), @Params nvarchar(max)
set @Params = N''
SELECT @SQL = N'SELECT ' + CASE WHEN @SomeNumber = 0 THEN '' ELSE 'TOP ' + CAST(@SomeNumber as varchar) END + ' COLUMNNAME FROM TABLE'
exec sp_executesql @SQL, @Params
0 голосов
/ 24 июня 2010

Я не думаю, что это возможно, потому что TOP применяется не только к столбцу, но и ко всей строке. Вам нужно будет создать два разных оператора выбора и поместить их в конструкцию IF ELSE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...