sql - SQL Server 存储过程中的多列过滤

标签 sql sql-server sql-server-2008

我的 Windows 窗体应用程序中有更多控件(假设有 10 个带有文本框、下拉菜单、单选按钮的控件)用于过滤数据,所有这些都不是强制性的,因此用户可以使用 1 个或更多控件来过滤数据。

现在我必须创建一个存储过程来根据输入过滤数据。

例如:如果用户在 1 个文本框控件中输入了一些文本,而剩下的 9 个控件的数据为空,我必须仅根据用户输入的文本框来过滤数据。

如果用户在 1 个文本框控件和 1 个下拉列表中输入了一些文本,而剩下的 8 个控件的数据为空,我必须仅根据用户输入的文本框和下拉列表来过滤数据。

我该怎么办?

在源代码中:

如果用户在任何控件上输入/选择文本,我将值作为参数传递,否则我将作为“null”传递给剩余的所有其他参数。

在存储过程中:

我给出了所有 10 个控件参数以从源代码中获取值,基于我正在过滤数据的参数。

if @Param1=null && @Param2=null && @Param3='SomeText'
    begin
        sELECT * FROM tABLE1 wHERE TableCOLUMN3=@Param3
    END
 if @Param1=null && @Param2='SomeText' && @Param3='SomeText'
    begin
        sELECT * FROM tABLE1 wHERE TableCOLUMN2=@Param2 AND TableCOLUMN3=@Param3
    END

注意:我需要过滤每个参数的每个表列的数据,简单地假设@Param1--TableCOLUMN1,@param2--TableCOLUMN2,过滤器因参数文本而异。

如果我这样做,我的存储过程将变得更加庞大和非常大,因为我有 10 个参数要检查(仅供引用,我在上面的示例中给出了 3 个参数)。

我想要的是:

因为我给了 10 个参数,基于有值的参数(一些非 NULL 的文本)我只需要使用 where 条件过滤数据。

有没有其他方法可以做到这一点,或者有人有任何其他方法可以做到这一点吗?

最佳答案

只要你让你的参数默认为 null 并且不为你不需要的参数传递一个值或者传递 dbnull 值那么你就可以像这样过滤

CREATE PROC dbo.SAMPLE
(
    @Param1 VARCHAR(255) = NULL,
    @Param2 VARCHAR(255) = NULL,
    @Param3 VARCHAR(255) = NULL,
    @Param4 VARCHAR(255) = NULL,
    @Param5 VARCHAR(255) = NULL,
    @Param6 VARCHAR(255) = NULL
)
AS
BEGIN
    SELECT  * 
    FROM    Table1
    WHERE   (@Param1 IS NULL OR TableCOLUMN1 = @Param1)
            AND (@Param2 IS NULL OR TableCOLUMN2 = @Param2)
            AND (@Param3 IS NULL OR TableCOLUMN3 = @Param3)
            AND (@Param4 IS NULL OR TableCOLUMN4 = @Param4)
            AND (@Param5 IS NULL OR TableCOLUMN5 = @Param5)
    OPTION (RECOMPILE) -- as JamesZ suggested to prevent caching
END


EXEC dbo.SAMPLE @Param2 = 'SomeText'  -- only filter where TableCOLUMN2 = @Param2

关于sql - SQL Server 存储过程中的多列过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30894259/

相关文章:

sql-server - 多列数据透视表

c# - 为什么我的 NHibernate 更新不工作?

php - 在查询的 while 循环中创建关联数组

c# - 故障转移后连接到镜像数据库

MySQL 错误 : not connected

sql-server - 更改 Azure VM 上的 SQL Server 版本

sql-server-2008 - 将 SQL Server 2008 r2 降级到 SQL Server 2008

sql - 如何使用一条插入语句将多行插入到 oracle 数据库中?

c# - 从存储过程返回值

sql-server - 生成没有日期的脚本