Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server SQL Server存储过程中的null值top()参数_Sql Server_Database_Select - Fatal编程技术网

Sql server SQL Server存储过程中的null值top()参数

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

我的SQLServer2005DB中有一个通用存储过程

它返回一个网站上使用的产品项目列表,我想让它在整个网站上更加可重用,这样我就可以使用它返回特定数量的产品

存储过程使用num items参数来限制返回的项的数量,但我想知道是否有一种方法可以让存储过程接受空值参数,而不必维护两个select语句或两个存储过程

下面是一个精简的示例,其中WHERE子句中没有额外的内容

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