2014-12-05 48 views
1

我試圖在存儲過程(SQL Server 2012)中創建可選參數,這將允許用戶選擇以下選項。SQL - 使用多個可選參數創建存儲過程

參考號碼範圍 - 持有表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) 
       ) 
      ) 

我現在遇到了一些問題。

這是不工作的第一件事情是,我可以有兩個參考和CUSTOMERNUMBER在空,我還是會得到返回的數據基礎上的日期範圍,

這是不工作的第二件事是當我輸入一個CustomerNumber範圍時,它將返回指定範圍之外的CustomerNumers。

我真的很憋屈如何

回答

0

這是不工作的第一件事情是,我可以有兩個參考和CUSTOMERNUMBER,我在零點解決這個問題,如果任何人都可以提供幫助

謝謝仍然會根據日期範圍得到返回的數據,

請說明一點 - 您是否想要這種行爲,或者這種行爲是否發生並且不可取?

第二件不起作用的是當我輸入一個CustomerNumber範圍時,它返回指定範圍之外的CustomerNumers。

您的AND/OR優先順序不正確。前括號中的OR的AND:

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

然而要注意的比較將只與客戶編號,例如固定位數的工作將F51F51111進行比較將不會很好。

另一點 - 在這樣的where子句中做CONVERT會傷害性能(SARGability)。在數據模型中將日期和時間分開似乎很奇怪 - 如果將日期和時間組合成一列,那麼可以直接進行日期時間比較?

+0

嗨歡呼你的答案我現在已經得到了第二部分的工作。 – 2014-12-05 12:19:25

+0

關於第一部分,如果用戶沒有輸入參考號碼和客戶號碼,則不應返回任何數據。用戶將不得不至少輸入其中一個選項,因此目前正在進行的操作並不理想! – 2014-12-05 12:21:13

+0

感謝您對CONVERT的觀點我會看看其他選項以及日期時間比較:) – 2014-12-05 12:26:52

相關問題