2012-09-21 79 views
0

假设我有在那里我传递5个过滤器作为参数的存储过程。这些参数是我查询中每列的过滤器。我的查询有5个字段。如果我的过滤器有一个或多个NULL(或“')值的参数,防止我的查询抛出异常/错误的最佳方法是什么?处理T-SQL查询与空滤器作为参数

SELECT 
     [helpings_turkey], 
     [helpings_green_beans], 
     [scoops_squash], 
     [qty_buscuits], 
     [pieces_pie] 
    FROM 
     [thanksgiving_guest] 
    WHERE 
     [helpings_turkey] > @helpings_turkey_filter 
     AND [helpings_green_beans] > @helpings_green_beans_filter 
     AND [scoops_squash] > @scoops_squash_filter 
     AND [qty_buscuits] > @qty_buscuits_filter 
     AND [pieces_pie] > @pieces_pie_filter 

回答

2

那么,如果该值为空,你不会得到一个错误,但你也不会得到结果。

你可以做这样的事情:

[helpings_turkey] > ISNULL(@helpings_turkey_filter, X)

其中“X”是你知道的比你最小的值小一些。

这对于小型数据集工作,但很可能将无法把你可能对你的[thanksgiving_guest]表中的任何索引的优势。

在这样的模式做的过滤器的最高效的方式就是通常动态组装SQL,通过插入条款时遇到像这样的非空过滤条件:

SET @sql = 'SELECT 
     [helpings_turkey], 
     [helpings_green_beans], 
     [scoops_squash], 
     [qty_buscuits], 
     [pieces_pie] 
    FROM 
     [thanksgiving_guest] 
    WHERE 1=1'; 

IF @helpings_turkey_filter IS NOT NULL BEGIN 
    SET @sql = @sql + '[helpings_turkey] > @helpings_turkey_filter' 
END 
... 
IF @pieces_pumpkin_pie_filter IS NOT NULL BEGIN 
    SET @sql = @sql + '[pieces_pumpkin_pie] > @pieces_pumpkin_pie_filter' 
END 

exec sp_executesql @sql, N'@helpings_turkey_filter, ..., @pieces_pumpkin_pie_filter', @helpings_turkey_filter, @pieces_pumpkin_pie_filter` 

需要注意的是,我们仍然继续即使我们正在动态地组装查询来参数化查询。

1
SELECT 
     [helpings_turkey], 
     [helpings_green_beans], 
     [scoops_squash], 
     [qty_buscuits], 
     [pieces_pie] 
    FROM 
     [thanksgiving_guest] 
    WHERE 
     [helpings_turkey] > IsNull(@helpings_turkey_filter, 0) 
     AND [helpings_green_beans] > IsNull(@helpings_green_beans_filter, 0) 
     AND [scoops_squash] > IsNull(@scoops_squash_filter, 0) 
     AND [qty_buscuits] > IsNull(@qty_buscuits_filter, 0) 
     AND [pieces_pumpkin_pie] > IsNull(@pieces_pumpkin_pie_filter, 0) 

这样的事情。如果传递参数,则使用该参数,如果不是默认值,则默认为零。

1

试试这个,因为这将解决您的问题(如果你是路过这可能是NULL多个参数:

SELECT 
     [helpings_turkey], 
     [helpings_green_beans], 
     [scoops_squash], 
     [qty_buscuits], 
     [pieces_pie] 
    FROM 
     [thanksgiving_guest] 
    WHERE 
     [helpings_turkey] > ISNULL(@helpings_turkey_filter, 0) 
     AND [helpings_green_beans] > ISNULL(@helpings_green_beans_filter, 0) 
     AND [scoops_squash] > ISNULL(@scoops_squash_filter, 0) 
     AND [qty_buscuits] > ISNULL(@qty_buscuits_filter, 0) 
     AND [pieces_pumpkin_pie] > ISNULL(@pieces_pumpkin_pie_filter, 0)