当输入参数为'ALL'时,T-SQL存储过程返回所有记录

时间:2012-06-21 10:10:47

标签: sql-server tsql stored-procedures

我有一个包含参数的存储过程:

@desk VARCHAR(50)

我想

SELECT *
FROM dbo.Desk
WHERE DeskName = @desk

我还希望在@desk = 'All'

的值时返回所有记录

最好的方法是什么?

4 个答案:

答案 0 :(得分:4)

只需将此条件包含在WHERE子句中,如下所示:

SELECT  *
FROM    dbo.Desk
WHERE   DeskName = @desk
OR      @desk = 'All'

正如Martin Smith在下面评论的那样,这种表现并不是最佳的 - 如果表格很小,那么为了T-SQL的清晰度/可维护性,您可能更喜欢这种简洁的方法而不是更高性能的方法。代码,但也要看看他链接到的文章...

答案 1 :(得分:2)

正如@MartinSmith指出的那样,field = @var or @var = 'ALL'类型的答案有一个巨大的缺点......

编译存储过程时,它会生成单个执行计划。而且执行计划需要足以处理参数可以抛出的所有场景。

在这种特殊情况下你可能(MartinSmith肯定地说)每次扫描整个表格。这是因为这样的执行计划能够满足两种可能的要求。

如此有效,您最终会得到一个least-worst case执行计划。


要为每个案例(@desk = 'ALL'@desk != 'All')制定不同的计划,您需要有两个查询。这意味着,遗憾的是,更简单,更简单的代码更好地执行代码......

IF (@desk = 'ALL')
  SELECT * FROM dbo.Desk
ELSE
  SELECT * FROM dbo.Desk WHERE deskName = @desk


@MartinSmith在他对该问题的评论中发布的链接更详细地介绍了这一点。根据您的SQL体验级别,强烈建议阅读;它解释了有关SQL Server行为的 lot 。但它非常深入。

更简单的方法很简单;试一试,看看。

使用适当的约束和索引为您的目的创建一个包含真实数据集的表。然后,为每个可能的答案创建一个存储过程,并测试它们。理想情况下使用分析器查看CPU时间,实际时间,读取,写入等

您可能会发现差异太小,您可以忍受“最差”的答案,并从中获益(因此将其视为“最佳”)。

您可能会看到实际时间中的一个更短,但CPU时间却要高得多。如果您具有高并发性,则可能因此决定使用最低CPU时间。或者,如果您的并发性较低,则可能需要更高的CPU时间但更低的实际时间。


编程很棒,很多考虑,交易和平衡。即使有一段SQL像这样简单:)

答案 2 :(得分:0)

最好的&简单方法:

SELECT * FROM dbo.Desk WHERE deskName = CASE WHEN @desk='All' THEN deskName ELSE @desk END

答案 3 :(得分:-1)

Declare @Desk varchar(50)

if @Desk = 'All' set @Desk = null

select * from dbo.desk where deskname = coalesce(@desk, deskname)