0
Posted on Wednesday, August 27, 2014 by 醉·醉·鱼 and labeled under
早上例会提到了这么一个事情,大概知道老大说的什么,但是不是很明白。回来做了一个测试,用WHERE (@param IS NULL OR col = @param) 的确会比较糟糕。放狗一搜,文章不是很多,好在也能够找到几篇文章提到了这个。

这个文章算是比较全面的,里面提到了两个解决方案,都还不错。
http://sqlinthewild.co.za/index.php/2009/03/19/catch-all-queries/

问题

如下图所示,当用到WHERE (@param IS NULL OR col = @param) 的时候,会用到Index Scan,即使你在last_name上定义好了index。

解决方案

就现在而言,有两种解决方式。
1. OPTION(RECOMPILE)(SQL 2008 SP1/SP2/Later)


2. Dynamical SQL
可以改成
DECLARE @sql nvarchar(2000) = N'';

IF @param IS NOT NULL
SET @sql = @sql + 'select * from people p where p.last_name = @_lastName'

EXEC sys.sp_executesql @sql, N'@_lastName varchar(255)', @_lastName = @param


0
Responses to ... Optional parameter in SQL - WHERE (@param IS NULL OR col = @param)

Post a Comment