SQL - 使用多个可选参数创建存储过程

时间:2014-12-05 11:12:59

标签: sql parameters java-stored-procedures

尝试在存储过程(SQL Server 2012)中创建可选参数,以允许用户选择以下内容。

参考编号范围 - 表2中的举例 - (可选)

客户编号范围 - 表3中所示 - (可选)

日期范围 - 表4中所示 - (强制性)

必须输入参考编号或客户编号

到目前为止,我有这个

declare @RefFrom Varchar(50) = NULL --'F51'  
declare @RefTo Varchar(50) = NULL --'F51' 
declare @CustomerNumFrom Varchar(50) = NULL --'FH1' 
declare @CustomerNumTo Varchar(50) = NULL --'FH1'
declare @fromDate date -- Works for date ranges 
declare @toDate date

set @fromDate = '2014-10-01'
set @toDate = '2014-11-05'

set @toDate  = IIF(@toDate  is NULL,  @toDate , DATEADD(day,1,@toDate ))
set @toDate  = IIF(@toDate  is NULL,  @fromeDate, @toDate )

SELECT 

Table2.Ref AS [Ref],
Table3.Number AS [Customer Number],
Table4.FromDate AS [Date],
Table4.ToTime AS [Time],



FROM Table1 
INNER JOIN Table2 ON Table1.ID = Table2.ID 
INNER JOIN Table3 ON Table2.ID = Table3.ID 
INNER JOIN Table5 ON Table1.DatID = Table5.ID 
INNER JOIN Table4 ON Table5.ID = Table4.ID 

where Table1.StatID = 1

AND Table4.ID
IN (    
        select Table4.ID 
        from Table4
        where 
            (
                CONVERT(DATETIME, CONVERT(CHAR(8), Table4.Date, 112) + ' ' + CONVERT(CHAR(8), Table4.Time, 108)) >=  @fromDate
                AND
                CONVERT(DATETIME, CONVERT(CHAR(8), Table4.Date, 112) + ' ' + CONVERT(CHAR(8), Table4.Time, 108)) <= @toDate
            )
            AND

            Table4.Info = 1

            AND

            (
                (Table2.Ref >= @RefFrom) OR (@RefFrom IS NULL)
                AND
                (Table2.Ref <= @RefTo) OR (@RefTo IS NULL)
            )

            AND   

            (
                (Table3.Number >= @CustomerNumFrom) OR (@CustomerNumFrom IS NULL)
                AND
                (Table3.Number <= @CustomerNumTo) OR (@CustomerNumTo IS NULL)
                )   
            )

目前我遇到了一些问题。

第一件不起作用的是,我可以在Reference和CustomerNumber中都有空值,而且我仍然可以根据日期范围返回数据,

第二件不起作用的是当我输入CustomerNumber范围时,它返回指定范围之外的CustomerNumers。

如果有人能提供帮助,我真的会坚持如何解决这个问题

由于

1 个答案:

答案 0 :(得分:0)

  

第一件不起作用的是,我可以在Reference和CustomerNumber中都有空值,而且我仍然可以根据日期范围返回数据,

请澄清一下 - 你想要这种行为,或者这种行为是否发生并且不可取?

  

第二件不起作用的是,当我输入CustomerNumber范围时,它会返回指定范围之外的CustomerNumers。

您的AND / OR优先级不正确。在AND之前对OR进行括号:

(Table3.Number >= @CustomerNumFrom OR @CustomerNumFrom IS NULL)
AND
(Table3.Number <= @CustomerNumTo OR @CustomerNumTo IS NULL)   

但请注意,该比较仅适用于客户编号上的固定位数,例如将F51F51111进行比较并不会很好。

另外一点 - 在像这样的where子句中执行CONVERT会损害性能(SARGability)。在数据模型中分离日期和时间似乎很奇怪 - 如果将日期和时间组合成一列,您可以进行直接日期时间比较吗?