Подтвердить что ты не робот

Выберите TOP (все)

declare @t int
set @t = 10
if (o = 'mmm') set @t = -1
select top(@t) * from table

Что делать, если я хочу, чтобы в целом это приводило к 10 строкам, но редко все из них.

Я знаю, что могу сделать это через "SET ROWCOUNT". Но есть ли какое-то переменное число, например -1, что приводит к тому, что TOP выводит все элементы.

4b9b3361

Ответ 1

Максимальное возможное значение, которое может быть передано TOP, равно 9223372036854775807, поэтому вы можете просто передать это.

Ниже я использую двоичную форму для max signed bigint, поскольку ее легче запомнить, если вы знаете базовый шаблон, а bigint - 8 байтов.

declare @t bigint =  case when some_condition then 10 else  0x7fffffffffffffff end;

select top(@t) * 
From table

Если у вас нет предложения по порядку, топ-10 будет всего 10 и зависит от оптимизации.

Если у вас есть предложение order by, чтобы определить верхние 10 и индекс для его поддержки, тогда план для указанного выше запроса должен быть прекрасным для любого возможного значения.

Если у вас нет индекса поддержки, а план показывает сортировку, вы должны рассмотреть возможность разделения на два запроса.

Ответ 2

im не уверен, что я понимаю ваш вопрос.

Но если вы иногда хотите, чтобы TOP и другие времена не просто использовали if/else construct:

if (condition)
  'send TOP
  SELECT TOP 10 Blah FROM...
else
  SELECT blah1, blah2 FROM...

Ответ 3

Вы можете использовать динамический SQL (но я лично стараюсь избегать динамического SQL), где вы создаете строку оператора, который вы хотите запускать из условий или параметров. Здесь также есть хорошая информация о том, как это сделать без динамического SQL:

http://sqlserver2000.databases.aspfaq.com/how-do-i-use-a-variable-in-a-top-clause-in-sql-server.html

Ответ 4

динамическая версия sql не так уж трудна.

CREATE PROCEDURE [dbo].[VariableTopSelect] 
    -- Add the parameters for the stored procedure here
    @t int

AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

declare @sql nvarchar(max)

if (@t=10)
begin
    set @sql='select top (10) * from table'
end
else
begin
    set @sql='select * from  table'
end

exec sp_executesql @sql


END

с этим sp, если они отправят 10 в sp, он выберет 10 лучших, иначе он выберет все.

Ответ 5

Это также возможно с помощью UNION и параметра

SELECT DISTINCT TOP 10
Column1, Column2
FROM Table
WHERE @ShowAllResults = 0
UNION 
SELECT DISTINCT 
Column1, Column2
FROM Table
WHERE @ShowAllResults = 1

Ответ 6

Лучшее решение, которое я нашел, - это выбрать нужные столбцы со всеми вашими условиями во временную таблицу, а затем сделать свой условный верх:

DECLARE @TempTable TABLE(cols...)

INSERT INTO @TempTable
SELECT blah FROM ...

if (condition)
 SELECT TOP 10 * FROM @tempTable
else
 SELECT * FROM @tempTable

Таким образом, вы следуете за DRY, получите свой условный TOP и так же легко читаете.

Приветствия.

Ответ 7

declare @top bigint = NULL
declare @top_max_value bigint = 9223372036854775807
if (@top IS NULL) 
begin
set @top = @top_max_value
end

select top(@top) * 
from [YourTableName]

Ответ 8

Используйте инструкцию "SET ROWCOUNT @recordCount" в начале запроса результата. Переменной "@recordCount" может быть любое положительное целое число. Это должно быть 0, чтобы вернуть все записи.

это означает, что "SET ROWCOUNT 0" вернет все записи, а "SET ROWCOUNT 15" вернет только TOP-15 строк набора результатов.

Недостатком может быть удар производительности при работе с большим количеством записей. Также SET ROWCOUNT будет эффективен во всей области выполнения всего запроса.