SQL Server:按层次过滤...需要帮助或建议

时间:2015-01-20 15:50:23

标签: sql-server join filter left-join temporary

我正在使用数据库并根据客户的需求,他希望能够从网页创建报告,所以我想要做的是一个带有查询的存储过程,然后将结果拉入数据集和自定义将其解析为XML以进行进一步操作。但是这里有捕获,我有N个参数用于过滤,所以这里是我正在做ATM的一个例子:

@p_parameter1 AS varchar(20)
@p_parameter2 AS varchar(15)
@p_parameter3 AS datetime
@p_parameter4 AS datetime
@p_parameter5 AS int
@p_parameter6 AS char(10)

begin
   select table1.column1 'SomeName', ... , tableN.columnN 'SomeName'
   from table1 tb1
        join table2 tb2 on tb1.key = tb2.foreignkey
        .
        .
        .
        join tableN tbN on tbM.key = tbN.foreignkey
        left join tableO tbO on tb2.key = tbO.foreignkey
   where  tb1.somefield like '%'@p_parameter1'%'
          tb2.somefield like '%'@p_parameter2'%'
          tb3.somefield like '%'@p_parameter3'%'
          tb1.tr1_date between @p_parameter3 and @p_parameter4
end

所以这是我正在做ATM的一个例子,我试图在一个查询中过滤它,但它仍然无法按照我想要的方式工作,有些过滤器有时会与NULL字段进行比较,没有结果,所以我尝试包括结果,即使一个过滤器是NULL,但它带来了一切...我也尝试在第一个查询中创建一个临时表并应用一个过滤器,然后到该临时表使另一个查询应用另一个过滤器等...但我不能让它工作。我很确定有更好的方法来处理所有这些混乱,但我对使用连接等的SQL查询很新。

提前致谢。

编辑1:我也忘记提及某些过滤器参数可能无法发送或发送为空。

1 个答案:

答案 0 :(得分:2)

您必须使用IS NULL表达式来检查参数是否为空,如果是,则不要使用它们进行过滤。尝试类似的东西:

where  
   (@p_parameter1 IS NULL OR tb1.somefield like @p_parameter1)
   AND
   (@p_parameter2 IS NULL OR tb2.somefield like @p_parameter2)
   AND
   ...