我正在处理一个带有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 server 2008 r2。
答案 0 :(得分:1)
如注释所示,请检查您的数据类型,如果必须,请仅使用VARCHAR。
编辑datetime,我们将getdate()转换为日期类型以删除时间值,然后返回日期时间类型。
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()))