2010-06-24 2 views

ответ

2

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

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 
0

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

+0

Хотя заявление относительно верхней применения к целому ряду не столбец правильно, это может быть достигнуто! см. ответ SPE109! – OneSHOT

1

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

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

IF (@SomeNumber = 0) 
BEGIN 
    SELECT TOP 5 ColumnName FROM Table 
END 
ELSE 
BEGIN 
    SELECT ColumnName FROM Table 
END 
1

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

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

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

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

4

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

Вы можете либо использовать динамический 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 
17

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

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

+1

SELECT TOP (SELECT @SomeNumber) идеально подходит. – BClaydon

1

Другой лазейку: использовать подзапрос с функцией 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)) 
Смежные вопросы