【发布时间】:2018-10-07 11:20:33
【问题描述】:
当涉及到在 SQL 存储过程中搜索带有可选参数的记录时,这两个查询中。两者都返回相同的结果。考虑到性能,您将使用哪一个以及为什么?
我有一个存储过程,它有多个搜索参数,将在多个表中搜索,并连接来自一个巨大的记录集。
DECLARE @EventName VARCHAR(100)
--SET @EventName = ''
--SET @EventName = NULL
SET @EventName = 'Coffee in Coffee Bean'
-- Query - 1
SELECT *
FROM EventDetails
WHERE
1 = CASE
WHEN @EventName IS NULL OR @EventName = '' THEN 1
WHEN EventName LIKE '%'+ @EventName +'%' THEN 1 ELSE 0
END
-- Query - 2
SELECT *
FROM EventDetails
WHERE
EventName LIKE '%' + CASE
WHEN LEN(LTRIM(@EventName)) > 0
THEN @EventName
ELSE EventName
END + '%'
【问题讨论】:
-
使用可选参数(我知道它可能很难看)性能的最佳选择是动态 SQL。你可以用它省略整个过滤器。
-
@EzLo:我知道,但这将是最危险的 sql,它可以创建类似 sql 注入(如果有人在参数值中输入查询)会给出整个表输出。
-
如果您有两匹马,并且您想知道哪两匹马更快,那么赛马 - 请参阅 Eric 的 Which is faster? Lippert 了解更多背景
-
@marc_s:问题是记录还没有在系统中,它的创建需要6个月左右...但是不能跑马:)只是在之前判断它们:)
-
谢谢@marc_s。当我对数百万条记录的表运行此查询时,第一个查询比第二个查询快得多。谢谢!
标签: sql-server tsql stored-procedures sql-like optional-parameters