Sql server SQL Server存储过程中的null值top()参数
我的SQLServer2005DB中有一个通用存储过程 它返回一个网站上使用的产品项目列表,我想让它在整个网站上更加可重用,这样我就可以使用它返回特定数量的产品 存储过程使用num items参数来限制返回的项的数量,但我想知道是否有一种方法可以让存储过程接受空值参数,而不必维护两个select语句或两个存储过程 下面是一个精简的示例,其中WHERE子句中没有额外的内容Sql server SQL Server存储过程中的null值top()参数,sql-server,database,select,Sql Server,Database,Select,我的SQLServer2005DB中有一个通用存储过程 它返回一个网站上使用的产品项目列表,我想让它在整个网站上更加可重用,这样我就可以使用它返回特定数量的产品 存储过程使用num items参数来限制返回的项的数量,但我想知道是否有一种方法可以让存储过程接受空值参数,而不必维护两个select语句或两个存储过程 下面是一个精简的示例,其中WHERE子句中没有额外的内容 create procedure GET_PRODUCTS @num_items int = null as se
create procedure GET_PRODUCTS
@num_items int = null
as
select TOP(@num_items) prod_id, prod_name, prod_price
from products
end
问题是如何选择所有记录,就好像将null传递给proc时top子句不存在一样
我有一些想法,但我不确定它们在SQL Server方面的性能如何,这就是我要评估的
1我可以检查param是否为null,如果为null,则将其重新分配给一个非常大的整数,该整数应该大于表中当前约5000条记录的数量,并且还在增长
2同上,但每次都要计算products表的大小使用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或其他任何东西的习惯,它提供了更好的查询计划重用。我认为这太复杂了。如果你想要所有的行,不要告诉它要取多少行!只要做:
IF @Num_Items IS NULL
BEGIN
SELECT prod_id,prod_name, prod_price from products
END
ELSE
<Your existing code>
编辑:
如果您绝对想使用TOP子句,只需将其指定给一个非常高的值,如2147483647。这是int数据类型的最高可能值。查询分析器不会尝试返回那么多行,但它会确保返回的行数不会超过您指定的行数,并且不会影响性能。您可以使用动态查询:
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
你能行
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
谢谢,但正如我在上面的帖子中提到的,出于可维护性的原因,我不想这样做。假设查询比我提供的简单示例复杂得多,那么维护该查询的两个版本就变得更加困难了!在SQL世界中,您需要绝对的性能,您会发现重复代码是不可避免的。你最终会牺牲性能,因为你只需要一小段代码就可以做一个万事通。我看到了对快速查询所做的一些小的、几乎微不足道的更改,这些更改只会破坏它们的性能。根据我最后的评论和最初的帖子,这并不是我真正想要做的。@carrot-我看到了你对另一个答案的评论,请参阅我的edit仅供参考:2147483647确实是最高的int值,一般来说,TOP表达式是不带百分比的。TOP本身的参数化可能会影响性能。EXEC“创建PROC foo@p INT AS SELECT TOP@p*FROM master..spt_值按编号排序,键入”;行政主任傅1;执行官傅2147483647;带重新编译的EXEC foo 2147483647;下降程序foo