切换输入参数

时间:2016-09-15 13:20:23

标签: sql-server tsql stored-procedures sql-server-2008-r2

鉴于以下存储过程,我希望能够移动我的输入参数,因此如果第一个参数不是有效日期,则将其他2个日期参数作为输入移位。如果我的存储过程没有输入参数,我还想使用当前日期。最好的方法是什么?我使用的是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存储过程中执行此操作。

1 个答案:

答案 0 :(得分:0)

您可以使用ISDATE函数检查第一个参数是否为有效日期。如果它不是用作InstrumentId。对于第二个要求,将日期参数默认为NULL并在SP检查ISNULL(2ndpara),ISNULL(3rdPara)这应该有效。