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를 사용하고 있습니다.
왜 날짜 필드에 varchars를 사용하고 있습니까? 이것이 테이블이 정의 된 방식입니까? 또한 시간이 오래 걸리면이 필드를 인덱싱하지 않을 수도 있습니다 (또는 인덱싱되지만 데이터 유형이 올바르지 않기 때문에 사용되지 않습니다). – paulbarbin
좋은 캐치. 'date_received'가'datetime'이므로 변경할 수 있습니다. –