当前位置:  开发笔记 > 数据库 > 正文

忽略T-SQL中的NULL参数

如何解决《忽略T-SQL中的NULL参数》经验,为你挑选了3个好方法。

我希望能够传入一个参数列表,并忽略那些为NULL的参数.这样查询实际上假装过滤器不存在并忽略它.

我是这样做的:

(@thing IS NULL or Thing=@thing) 

这是对的,如果是的话,它会表现得很糟糕吗?它似乎比分别构造SQL要慢很多.

这样做的最佳方法是什么?

固定!请参阅Marc Gravell的回答.总之,使用IS NULL多次是一个很大的性能影响.



1> Marc Gravell..:

一旦你获得了超过其中的几个,那么是的:它开始变得非常缓慢.在这种情况下,我倾向于使用生成的TSQL - 即

DECLARE @sql nvarchar(4000)
SET @sql = /* core query */

IF @name IS NOT NULL
    SET @sql = @sql + ' AND foo.Name = @name'

IF @dob IS NOT NULL
    SET @sql = @sql + ' AND foo.DOB = @dob'

// etc

EXEC sp_ExecuteSQL @sql, N'@name varchar(100), @dob datetime',
        @name, @dob

等等

请注意,sp_ExecuteSQL缓存查询计划,因此具有相同args的任何查询都可能会重新使用该计划.

缺点是除非您签署SPROC,否则调用者需要对表的SELECT权限(而不仅仅是SPROC上的EXEC权限).



2> Brendan Enri..:

我会这样处理它.

WHERE Thing = ISNULL(@Thing, Thing)

如果您只是将参数用作where子句的过滤器,那么这将非常有效.如果参数为null,它将忽略该参数.


避免!不要使用这个例子.如果为"@Thing"传入null并想要拉取所有值(包括null),则不起作用.如果"Thing"为null,则得到null = null,每个人都知道它的计算结果为false.

3> atfergs..:

我一般用

WHERE (id = @id OR @id IS NULL)
AND (num = @num OR @num IS NULL)

等等

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有