SQL服务器:按层过滤...需要帮助或建议
SQL Server: Filter by layers ... Need help or advise
我正在使用数据库,根据我客户的需求,他希望能够从网页创建报告,所以我想做的是一个带有查询的存储过程,然后提取结果到数据集中并将其自定义解析为 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,但它带来了一切......我还尝试在第一个查询中制作一个临时 table 并应用一个过滤器,然后应用到那个临时table 进行另一个查询以应用另一个过滤器等等......但我无法让它工作。我很确定有更好的方法来处理所有这些混乱,但我对 SQL 带有连接等的查询还很陌生。
提前致谢。
编辑 1:另外我忘了提到一些过滤器参数可能不会发送,或者作为空值发送。
您必须使用 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
...
我正在使用数据库,根据我客户的需求,他希望能够从网页创建报告,所以我想做的是一个带有查询的存储过程,然后提取结果到数据集中并将其自定义解析为 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,但它带来了一切......我还尝试在第一个查询中制作一个临时 table 并应用一个过滤器,然后应用到那个临时table 进行另一个查询以应用另一个过滤器等等......但我无法让它工作。我很确定有更好的方法来处理所有这些混乱,但我对 SQL 带有连接等的查询还很陌生。
提前致谢。
编辑 1:另外我忘了提到一些过滤器参数可能不会发送,或者作为空值发送。
您必须使用 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
...