代码之家  ›  专栏  ›  技术社区  ›  Jason Down

是否有方法创建接受<=n参数的参数化查询或存储过程?

  •  4
  • Jason Down  · 技术社区  · 15 年前

    假设我有一个搜索屏幕,用于查找项目。屏幕上有各种可选的搜索选项,这些选项将导致SQL查询语句发生变化。

    以下是一些示例搜索:

    1. 描述搜索
    2. 说明搜索+项目供应商ID
    3. 说明搜索+项目供应商ID+项目层次结构级别1 ID
    4. 说明搜索+项目供应商ID+项目层次结构级别1 ID+级别2 ID
    5. 项目层次结构级别1 ID+级别2 ID(无说明,无项目供应商ID)

    …你明白了。有很多可能的组合。我希望使用参数化查询来获得性能方面的好处,并且在整个程序的其余查询中使用它们。

    是否有一种方法可以做到这一点,或者强制我创建每个可能的查询并匹配sqlitecommand对象,或者基于所选选项使用StringBuilder动态生成查询字符串?

    我正在使用带有C_3.0的sqlite.net数据提供程序(在3.5 Compact框架上)。


    更新

    基于参数默认值为空的一些建议,并使用 (@param isnull or column = @param) 我想我应该能让这个工作。我会通知你的。

    注意:我避免使用存储过程,因为其余代码使用参数化查询而不是存储过程。为了将来维护程序员的理智,我希望保持一切一致。无论如何,这不应该有太大的区别。


    更新2

    这工作 伟大的 在桌面系统上(这是我对查询进行初始测试的地方)。但是,在我使用的Windows CE设备上速度非常慢。慢得令人无法忍受。尽管如此,我将来肯定会用到它,而且非常方便。在移动设备上运行查询时不需要。

    谢谢

    3 回复  |  直到 15 年前
        1
  •  4
  •   William Edmondson    15 年前

    从存储过程方面,您可以将值默认为空,然后构建WHERE子句来容纳这个空值。

    ALTER Procedure FooProcedure 
        @SupplierID INT = NULL,
        @LevelOne INT = NULL 
    AS
    BEGIN
    
        SELECT SupplierID, LevelOne 
          FROM FooTable
         WHERE @SupplierID IS NULL OR SupplierID = @SupplierID
           AND @LevelOne IS NULL OR LevelOne = @LevelOne 
    
    END
    
        2
  •  1
  •   jn29098    15 年前

    可以指定参数默认值并处理存储过程中的逻辑:

    create procedure mySproc(@description nvarchar(20) = null, @supplierid int = null, etc...)
    

    处理存储过程主体中参数是否为空的逻辑。

        3
  •  0
  •   NikolaiDante    15 年前

    您最好为每种情况创建存储过程。

    如果在用StringBuilder构建的C中有内联SQL代码,那么执行计划将永远不会被缓存,也不会像存储过程那样执行。