【问题标题】:Where clause filter in stored procedure存储过程中的 where 子句过滤器
【发布时间】:2020-12-08 17:13:00
【问题描述】:

我正在尝试创建一个过程,它需要通过多个标量参数过滤具有 where 条件的记录。我正面临I.[status] 专栏的问题。

在该列中,值将是“待定”、“拒绝”、“已提交”。但是当值带有“All”时,我需要选择所有状态类型(待定、拒绝、提交)

CREATE PROCEDURE [dbo].[sp_cc_get_Invoices]   
    (@po_id         INT = NULL,  
     @sortBy        VARCHAR(50) = NULL,  
     @sortDirection VARCHAR(50) = 0,  
     @pageSize      INT = NULL,
     @page          INT = NULL,
     @TotalRows     INT = NULL OUTPUT,  
     @time_zone_offset INT = 0,  
     @vendor_id     VARCHAR(MAX) = NULL,
     @status        VARCHAR(20) = 'All',
     @invoice_id    INT = NULL,
     @invoice_from_dt DATETIME2 = NULL,
     @invoice_to_dt   DATETIME2 = NULL)  
AS  
BEGIN  
    SELECT 
        I.invoice_id, I.invoice_amount, I.[status],
        v.vendor_id, I.po_id, v.vendor_name,    
        I.netsuit_invoice_id, cd.currency_symbol
    FROM    
        invoice_details I   
    LEFT JOIN 
        vendor_details v ON v.vendor_id = I.vendor_id 
    LEFT JOIN 
        currency_details cd ON cd.currency_id = I.currency_id   
    WHERE 
        (@po_id IS NULL OR I.po_id = @po_id) 
        AND (@vendor_id IS NULL OR I.vendor_id = @vendor_id)  
        AND (@invoice_id IS NULL OR @invoice_id = '' OR I.invoice_id = @invoice_id) 
        AND (I.invoice_date BETWEEN @invoice_from_dt AND @invoice_to_dt)  
        AND I.[status] = @status
END

如何过滤所有状态记录?

【问题讨论】:

  • NULL 是您的日期参数的默认值吗?然而,使用这些默认值将产生一个空的结果集。供应商 ID 参数是 varchar(max)?而且您还没有开始处理明显的分页逻辑。重新开始 - 在互联网上搜索有关动态搜索条件的建议 - 从 Erland's discussion 开始。然后搜索解决分页问题的技术。

标签: sql sql-server string stored-procedures where-clause


【解决方案1】:

你可以用布尔逻辑来表达。

只是改变:

and I.[status] = @status

收件人:

and (@status = 'All' or I.[status] = @status)

【讨论】:

  • 谢谢。有效。但它是如何工作的?因为没有状态“全部”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-08
  • 2014-01-24
  • 2021-01-22
  • 2015-01-29
  • 2016-07-02
  • 2013-02-05
相关资源
最近更新 更多