2016-09-14 2 views
0

Я работаю над хранимой процедурой, которая принимает 3 входных параметра. Первый требуется, но остальные 2 являются датами и не требуются. Я хочу, чтобы параметры даты были по умолчанию для текущего дня. Вот то, что я до сих пор:Использовать текущий день по умолчанию

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.

+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

Спасибо за обновление. К сожалению, теперь я получаю следующую ошибку: «Msg 156, уровень 15, состояние 1, процедура p_qIMO_TEST_2, строка 4 Неверный синтаксис рядом с ключевым словом« CONVERT ». Msg 137, уровень 15, состояние 2, процедура p_qIMO_TEST_2, строка 29 Должен объявить скалярную переменную «@i_DateLow». «Должен ли я явно объявить их для работы? –