Параметр top () с нулевым значением в хранимой процедуре SQL Server - PullRequest
0 голосов
/ 24 июня 2011

У меня есть общий сохраненный процесс в моей базе данных SQL Server 2005

Он возвращает список элементов продукта для использования на веб-сайте, и я хочу сделать его более пригодным для повторного использования на сайте, чтобы я мог использовать его для возвратаопределенное количество продуктов.

Хранимая процедура принимает параметр num items, чтобы ограничить количество возвращаемых товаров, но мне интересно, есть ли способ, чтобы хранимый процесс мог принимать параметр с нулевым значением безприбегнуть к ведению двух операторов выбора или двух сохраненных процедур.

Вот урезанный пример без лишних вещей в предложении WHERE и т. д.

create procedure GET_PRODUCTS
   @num_items int = null
as
   select TOP(@num_items) prod_id, prod_name, prod_price 
   from products

end

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

У меня есть пара идей, но я не уверен, как они оцениваются с точки зрения производительности в отношенииSQL Server и это то, что я пытаюсь оценить?

1) Я мог бы проверить, является ли параметр нулевым, и если да, переназначить его на очень большое целое числоэто должно быть больше, чем количество записей в таблице (в настоящее время около 5000 и растет)

2) То же, что и выше, но каждый раз при подсчете размера таблицы продуктов каждый раз

Ответы [ 4 ]

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

Я думаю, вы слишком усложнили это. Если вы хотите ВСЕ строки, не говорите, сколько нужно выбрать! Просто сделай:

IF @Num_Items IS NULL
BEGIN
   SELECT prod_id,prod_name, prod_price from products
END
ELSE
<Your existing code>

EDIT:

Если вы абсолютно хотите использовать предложение TOP, просто присвойте ему очень высокое значение, например 2147483647. Это максимально возможное значение для типа данных int. Анализатор запросов не будет пытаться вернуть столько строк, но будет следить за тем, чтобы он не возвращал БОЛЬШЕ , чем вы указали, и это вообще не должно влиять на производительность.

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

используйте IF и создайте два запроса:

create procedure GET_PRODUCTS

@num_items int = null

as
IF @num_items IS NULL
    select prod_id,prod_name, prod_price from dbo.products
ELSE
    select TOP(@num_items) prod_id,prod_name, prod_price from dbo.products

GO

также имеет привычку всегда использовать схему таблицы (dbo или любую другую), это обеспечивает лучшее повторное использование планов запросов.

0 голосов
/ 25 июня 2011

Вы можете сделать

 select TOP(@num_items) prod_id, prod_name, prod_price 
   from products where @num_items is not null
union
 select prod_id, prod_name, prod_price 
   from products where @num_items is null

или вы можете

select TOP(isnull(@num_items,Very large number)) prod_id, prod_name, prod_price 
   from products
0 голосов
/ 25 июня 2011

вы можете использовать динамический запрос:

create procedure GET_PRODUCTS

@num_items int = null

as
declare @sql nvarchar(max)

set @sql = N'select '
if @num_items is not null
    set @sql = @sql + 'TOP(@num_items) '

set @sql = @sql + 'prod_id,prod_name, prod_price from products'

execute sp_executesql @sql
    ,N'@num_items int = null'
    ,@num_items
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...