2016-09-14 16 views
0

3 개의 입력 매개 변수를 사용하는 저장 프로 시저에서 작업하고 있습니다. 첫 번째는 필수이지만 다른 두 개는 날짜이므로 필수 사항은 아닙니다. 날짜 매개 변수가 현재 날짜로 기본 설정되기를 원합니다. 다음은 지금까지 내가 가지고있는 것입니다 :현재 날짜를 기본값으로 사용합니다.

USE [MyDB] 
GO 

/****** Object: StoredProcedure [dbo].[p_qIMO_TEST_2] 

Example: exec [dbo].[p_qIMO_TEST_2] 'DS5264000001','20090101','20100101' 

*/ 

SET ANSI_NULLS ON 
GO 

SET QUOTED_IDENTIFIER ON 
GO 

IF NOT EXISTS (SELECT * FROM sys.objects WHERE type = 'P' AND OBJECT_ID = OBJECT_ID('qIMO_TEST_2')) 
    exec('CREATE PROCEDURE [dbo].[qIMO_TEST_2] AS BEGIN SET NOCOUNT ON; END') 
GO 

alter PROCEDURE [dbo].[p_qIMO_TEST_2] 
    @i_InstrumentID VARCHAR(15) = NULL, 
    @i_DateLow  VARCHAR(15) = '20090101', 
    @i_DateHigh  VARCHAR(15) = '20291231' 
AS 
IF @i_InstrumentID IS NULL 
BEGIN 
    PRINT 'Error: You must specify a valid Instrument ID' 
    RETURN 
END 
    SELECT * FROM 
    (
      SELECT 
       out_interface_id, 
       msg_id, 
       CAST(xml_msg as XML).value(
        '(//InstrumentID)[1]','nvarchar(MAX)') 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 

지금은 단지 임의의 범위의 날짜를 사용하고 있지만 결과를 반환하는 데는 시간이 오래 걸립니다. 누구든지 제공 할 수있는 제안을 찾고 있습니다. 저는 MS SQL 서버 2008 r2를 사용하고 있습니다.

+1

왜 날짜 필드에 varchars를 사용하고 있습니까? 이것이 테이블이 정의 된 방식입니까? 또한 시간이 오래 걸리면이 필드를 인덱싱하지 않을 수도 있습니다 (또는 인덱싱되지만 데이터 유형이 올바르지 않기 때문에 사용되지 않습니다). – paulbarbin

+0

좋은 캐치. 'date_received'가'datetime'이므로 변경할 수 있습니다. –

답변

1

설명에서 알 수 있듯이 데이터 유형을 확인하고 필요한 경우 VARCHAR 만 사용하십시오.

datetime에 대한 편집에서 getdate()를 날짜 유형으로 변환하여 시간 값을 삭제 한 다음 datetime 유형으로 되돌립니다.

alter PROCEDURE [dbo].[p_qIMO_TEST_2] 
    @i_InstrumentID VARCHAR(15) = NULL, 
    @i_DateLow  DATETIME = NULL, 
    @i_DateHigh  DATETIME = NULL 
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())) 
+0

그것들을'datetime'으로 정의 할 수 있습니다. 내가 할 때, 나는 단지 getdate()에 설정할 수 없다. 내가 가지고있는 다른 옵션은 무엇인가? –

+0

나는 그것을 편집 할 것이다. – JiggsJedi

+0

업데이트 해 주셔서 감사합니다. 불행히도 다음과 같은 오류가 발생합니다 :'메시지 156, 레벨 15, 상태 1, 프로 시저 p_qIMO_TEST_2, 라인 4 'CONVERT'키워드 근처의 구문이 올바르지 않습니다. 메시지 137, 수준 15, 상태 2, 프로 시저 p_qIMO_TEST_2, 줄 29 스칼라 변수 "@i_DateLow"를 선언해야합니다. 명시 적으로 작동하도록 명시해야합니까? –

관련 문제