我有一个包含参数的存储过程:
@desk VARCHAR(50)
我想
SELECT *
FROM dbo.Desk
WHERE DeskName = @desk
我还希望在@desk = 'All'
。
最好的方法是什么?
答案 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)