我正在使用数据库并根据客户的需求,他希望能够从网页创建报告,所以我想要做的是一个带有查询的存储过程,然后将结果拉入数据集和自定义将其解析为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:我也忘记提及某些过滤器参数可能无法发送或发送为空。
答案 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
...