我有一个具有参数的存储过程:
@desk VARCHAR(50)
我想要
SELECT *
FROM dbo.Desk
WHERE DeskName = @desk
我还想在 . 的值时返回所有记录@desk = 'All'
。
最好的方法是什么?
我有一个具有参数的存储过程:
@desk VARCHAR(50)
我想要
SELECT *
FROM dbo.Desk
WHERE DeskName = @desk
我还想在 . 的值时返回所有记录@desk = 'All'
。
最好的方法是什么?
只需在您的WHERE
子句中包含此条件,如下所示:
SELECT *
FROM dbo.Desk
WHERE DeskName = @desk
OR @desk = 'All'
正如下面的 Martin Smith 评论的那样,这种性能不会是最佳的 - 如果表很小,那么您可能更喜欢这种简洁的方法而不是更高性能的选项,只是为了您的 T-SQL 代码的清晰/可维护性,但是还请查看他链接到的文章...
正如@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 :)
最好和简单的方法:
SELECT * FROM dbo.Desk WHERE deskName = CASE WHEN @desk='All' THEN deskName ELSE @desk END
Declare @Desk varchar(50)
if @Desk = 'All' set @Desk = null
select * from dbo.desk where deskname = coalesce(@desk, deskname)