T-SQL,其中int=@var/@var=null?

T-SQL,其中int=@var/@var=null?,sql,sql-server,tsql,null,integer,Sql,Sql Server,Tsql,Null,Integer,我遇到的情况是调用存储过程并传入一些变量。在某些情况下,我将传入null,并希望它返回所有内容。采用以下公式(年龄是一个整数列): 现在如果我通过22分,我会得到迈克和鲍勃。同样地,18岁也会让我成为弗雷德。但是,如果我在传入null/don't set@AgeVar时想要所有3行呢?这是我的一个非常简单的问题 编辑:存储过程非常复杂,我不想让所有的部分都翻一番,但在下面的一个答案中,它们是原来的两倍。还有其他方法吗 SELECT * FROM [table] WHERE [Age]=@AgeV

我遇到的情况是调用存储过程并传入一些变量。在某些情况下,我将传入null,并希望它返回所有内容。采用以下公式(年龄是一个整数列):

现在如果我通过22分,我会得到迈克和鲍勃。同样地,18岁也会让我成为弗雷德。但是,如果我在传入null/don't set@AgeVar时想要所有3行呢?这是我的一个非常简单的问题

编辑:存储过程非常复杂,我不想让所有的部分都翻一番,但在下面的一个答案中,它们是原来的两倍。还有其他方法吗

SELECT * FROM [table] WHERE [Age]=@AgeVar OR @AgeVar IS NULL

正如上面和下面多次提到的,这种技术会降低大型表查询的性能。用户要当心。

我发现,如果您有一个常见的案例,那么请使用案例语句。这只会使性能在极少数情况下受到拖累。因此,如果您更经常地将null作为参数传入,那么这将更有效

IF @AgeVar IS NULL 
    BEGIN
        SELECT  *
        FROM    @Table
    END
ELSE
    BEGIN
        SELECT  *
        FROM    @Table
        WHERE   Age = @AgeVar
    END
SELECT * 
FROM [table] 
WHERE 
    0 = 
        CASE 
            WHEN @AgeVar IS NULL THEN 0
            WHEN [Age]=@AgeVar THEN 0
        END

这将为您提供比
[Age]=@AgeVar或@AgeVar为NULL
方法更好的性能,因为它将生成索引搜索而不是索引扫描:

SELECT * FROM [Table1]
WHERE COALESCE(@AgeVar, Age) = Age

它使您的代码具有相当的可读性,特别是当您有多个参数可以用于搜索或不用于搜索时,并且仍然可以提供合理的性能。

如果您没有时间单击Joe的链接,请阅读他非常优秀的文章,他证明了使用动态SQL可能会比这种方法有更好的表现。@DOK:我不是这篇文章的作者。那篇文章是盖尔·肖写的,他在SQL Server方面比我聪明得多。@Joe Stefanelli,我们都站在巨人的肩膀上,不是吗?请停止在你的帖子上签名。是的,我曾经考虑过这样的事情,但是我现在使用的存储过程非常庞大,我不想仅仅为了这个而将每个部分分成两部分。还有其他方法吗?已经发布的
选项会起作用,正如
中的ISNULL(@AgeVar,[Age])=[Age]
一样。然而,乐观主义者会更好地处理上面公布的选项。您可以考虑创建一个临时表,使用<代码>填充它,如果…ELSE然后在过程的后面提到它,但这可能会更糟糕,这取决于过程的其余部分和标记等。我将关注此过程中的查询计划缓存。与在select语句中使用不必要的谓词相比,我更关注查询缓存的性能影响。为了解决这个问题,OP发布了这是最有效的解决方案。如果需要更多的变量,那么SQL注入可能是前进的方向,正如其他评论/文章中所讨论的那样。@GarethD我想你指的是动态SQL,而不是SQL注入。除非您的意图不太体面,并且SQL注入是给定的!:-)这是一个很好的答案。从来没有想过这样做。明亮的过一会儿我会把它标记为一个答案,因为它说我要做什么。但是谢谢!!仅供参考。。。这将严重破坏SqlServer中的查询执行计划。。。由于上述问题,我们最近不得不重构一系列存储过程。@Eonicampbell:这就是我在评论这个问题时引用的博客文章的要点。是的,这是一个解决方案,但它肯定是性能杀手。但是,不管怎样,当需求指定此行为时,您的选择是有限的。将报表绑定到单个查询或存储过程时尤其如此。老实说,我认为性能杀手更多的是数据库设计。这个查询可能没有帮助,但我很有信心解决我的问题会使这种风格的查询不再需要:(.最好了解更多关于db设计和索引的信息..我还没有实际测试过这一点,但对我来说这似乎不起作用:如果[Age]=@AgeVar,那么最终的查询将看起来像[table]中的select*其中0=0…您最终将获得所有记录!我在许多情况下都使用了它,取得了巨大的成功。想想SQL是如何工作的,这应该是有意义的。它类似于一个exists。其中0=0的select*from[table]仅在当前被评估行的[Age]情况下出现列等于@AgeVar。根据您的逻辑,只要SQL中有任何匹配,那么所有记录都将返回
SELECT * FROM [Table1]
WHERE COALESCE(@AgeVar, Age) = Age