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
   ...