2016-09-15 20 views
0

鑑於以下存儲過程,我希望能夠移動我的輸入參數,因此如果第一個參數不是有效日期,則其他兩個日期參數將作爲輸入進行移位。如果沒有輸入參數到我的存儲過程,我也想要使用當天。什麼是最好的方式來做到這一點?我正在使用SQL Server 2008 R2。移位輸入參數

Create PROCEDURE [dbo].[p_qIMO_TEST_2] 
    @i_InstrumentID VARCHAR(15) = NULL, 
    @i_DateLow  DATETIME = '20090101', 
    @i_DateHigh  DATETIME = '20291231' 
AS 
IF @i_DateLow IS NULL SET @i_DateLow = CONVERT(DATETIME,CONVERT(DATE,GETDATE())) 
IF @i_DateHigh IS NULL SET @i_DateHigh = CONVERT(DATETIME,CONVERT(DATE,GETDATE())) 
    SELECT * FROM 
    (
      SELECT 
       out_interface_id, 
       msg_id, 
       CAST(xml_msg as XML).value(
        '(//InstrumentID)[1]','nvarchar(15)') AS InstrumentID, 
       msg_type, 
       xml_msg, 
       CAST(xml_msg AS XML) as [Quick_XML], 
       date_received, 
       status, 
       last_modified, 
       environment, 
       transaction_closed_date 
      FROM MyTable 
      WHERE msg_type IN ('ABC','DEF') 
      AND date_received >= @i_DateLow 
      AND date_received < DATEADD(DAY,1,@i_DateHigh) -- Need to add 1 to the DateHigh for 
                             -- date range criteria to work properly (>= and <) 
    ) x 
    WHERE (x.InstrumentID = @i_InstrumentID OR x.InstrumentID = NULL) 
    ORDER BY date_received DESC 
RETURN 
GO 

更新更加清晰

基本上,我希望它來檢查的第一個參數是一個有效的日期,可能使用IsDate(),如果它是不是有效的日期,然後我知道這是一個InstrumentID。如果它是一個InstrumentID,我想檢查下一個參數是否在那裏。如果有,請檢查是否有第三個參數。這表明所有3個參數都在那裏,所以我知道這是一個有效的InstrumentID,其開始和結束日期。如果只有一個有效的第一個參數,我希望它使用第二個和第三個參數的當前日期。我知道這很複雜,但這就是我被要求做的事情。沒有前端應用程序,所以我必須在T-SQL存儲過程中執行此操作。

回答

0

您可以使用ISDATE函數檢查第一個參數是否爲有效日期。如果它不作爲InstrumentId使用。對於第二個要求,使日期參數默認爲NULL,並在SP檢查ISNULL(2ndpara),ISNULL(3rdPara)這應該工作。

+0

爲了更加清晰,我更新了我的帖子。 –

+0

更新了我的解決方案。如果你不清楚,請告訴我。 – Mahendra