Выберите TOP (все)
declare @t int
set @t = 10
if (o = 'mmm') set @t = -1
select top(@t) * from table
Что делать, если я хочу, чтобы в целом это приводило к 10 строкам, но редко все из них.
Я знаю, что могу сделать это через "SET ROWCOUNT". Но есть ли какое-то переменное число, например -1, что приводит к тому, что TOP выводит все элементы.
Ответы
Ответ 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 будет эффективен во всей области выполнения всего запроса.