1

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

@desk VARCHAR(50)

我想要

SELECT *
FROM dbo.Desk
WHERE DeskName = @desk

我还想在 . 的值时返回所有记录@desk = 'All'

最好的方法是什么?

4

4 回答 4

5

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

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

正如下面的 Martin Smith 评论的那样,这种性能不会是最佳的 - 如果表很小,那么您可能更喜欢这种简洁的方法而不是更高性能的选项,只是为了您的 T-SQL 代码的清晰/可维护性,但是还请查看他链接到的文章...

于 2012-06-21T10:11:43.453 回答
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 的行为。但它非常深入。

更简单的方法是简单的;试试看。

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

您可能会看到差异是如此之小,您可以接受“最差”的答案并从它的简短中受益(因此使其成为您的“最佳”答案)。

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


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

于 2012-06-21T10:37:30.837 回答
0

最好和简单的方法:

SELECT * FROM dbo.Desk WHERE deskName = CASE WHEN @desk='All' THEN deskName ELSE @desk END
于 2012-06-21T10:58:04.583 回答
-1
Declare @Desk varchar(50)

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

select * from dbo.desk where deskname = coalesce(@desk, deskname)
于 2015-10-27T17:13:49.017 回答