SQL Server - 按可变数量的参数过滤查询

Posted

技术标签:

【中文标题】SQL Server - 按可变数量的参数过滤查询【英文标题】:SQL Server - filter query by variable number of parameters 【发布时间】:2018-06-13 18:27:52 【问题描述】:

场景:

    我有一个存储过程 (spFetch) 我想返回一个列表 表中的结果。 存储过程 (spFetch) 定义了许多 调用者可能会或可能不会传入的参数。如果未传递参数值 由调用者输入,它们默认为 null。 如果这些参数中的任何一个 不为空,它们应该在 select 的 where 子句中使用 (spFetch) 中的语句以返回过滤结果。 我有一个前端应用程序可以充当调用者,但它没有设置 关于如何传递参数(逗号分隔 列表、显式引用等)

这里的想法是,在后端我可以限制可能的查询参数,同时仍然允许范围广泛的参数。

spFetch怎么写才能满足上述场景的所有要求?

对于这个场景必须有一个最佳实践,认为其他开发人员还没有这样做是不是太疯狂了?

【问题讨论】:

sqlsentry.tv/the-kitchen-sink-procedure 大多数不是用逗号分隔的列表,因为您必须然后拆分该列表。查看表值参数以配合来自@LukaszSzozda 的厨房水槽链接 只是一个旁注,你通常不想命名以 sp 开头的存储过程,因为它可能与以 sp_ 开头的系统冲突,所以只需命名你的 usp_什么的 @sniperd - 可能冲突吗?怎么样? 厨房水槽绝对是答案,很棒的解决方案! @Lukasz Szozda,想正式将其添加为答案,以便我标记对吗? 【参考方案1】:
CREATE PROCEDURE [dbo].[p_Search] ( @Name sysname = NULL, @Objectid INT  = NULL, @schemaId INT  = NULL )
AS
BEGIN
    SELECT
        [name]
       ,[object_id]
       ,[principal_id]
       ,[schema_id]
       ,[parent_object_id]
       ,[type]
       ,[type_desc]
       ,[create_date]
       ,[modify_date]
       ,[is_ms_shipped]
       ,[is_published]
       ,[is_schema_published]
    FROM
        [sys].[objects]
    WHERE 1                                = 1
          AND [name]                         = ISNULL(@Name, [name])
          AND ISNULL(@Objectid, [object_id]) = [object_id]
          AND ISNULL(@schemaId, [schema_id]) = [schema_id];
END;

EXEC p_search @Name = 'sysallocunits'

【讨论】:

感谢@amy-b 的格式化;仍在尝试找出格式选项

以上是关于SQL Server - 按可变数量的参数过滤查询的主要内容,如果未能解决你的问题,请参考以下文章

具有可变数量的参数SQL的多次插入

用于从连接表中进行选择的 T-SQL 查询,其中有可变数量的参数?

按特定值过滤时,SQL Server 查询永远不会完成

sqlserver查询,按分公司、汇总当月的订单数量怎么写sql查询

SQL Server 2008 R2-查询以获取按月销售的总销售额和数量

使用可变数量的参数过滤多个 Django 模型字段