Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > Проблема с передаче параметров типа Datetime ХП


Автор: Houl 18.9.2009, 17:21
Код

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE Outlook_import
    @login varchar(max) = '%%',
    @StartDate datetime = '1888-01-01 00:00:00',  -- (1)-- dateadd( dd, -7, CURRENT_TIMESTAMP),
    @FinishDate datetime = '1888-01-01 00:00:00'  --(2)-- dateadd( dd, 21, CURRENT_TIMESTAMP)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    --SELECT <@Param1, sysname, @p1>, <@Param2, sysname, @p2>
--3    
if @StartDate = '1888-01-01 00:00:00'
    BEGIN
    set @StartDate = dateadd( dd, -7, CURRENT_TIMESTAMP)
    END
        if @FinishDate = '1888-01-01 00:00:00'
    BEGIN
    set @StartDate = dateadd( dd, 21, CURRENT_TIMESTAMP)
    END
--4
SELECT    '1|'+
        .......
FROM    EVENTS as E
........

where    U1.Login like @login
and
((@StartDate >= E.StartDate and @StartDate <= E.FinishDate)
or
(@FinishDate >= E.StartDate and @FinishDate <= E.FinishDate)
)
END
GO

Есть хранимая процедура, которая должна отбирать из БД записи за определённый период. Если период не задан, то по умолчанию она должна возвращать данные за период текущая дата - 7д и до ТД+21 д
Однако обнаруживалась проблема
1. закомментаренные функции (1) и (2) в стр.8 и стр.9 не срабатывают, из-за чего приходится идти на ухищрения: по умолчанию забивать не реальные даты и проверять есть ли их изменения (стр.19-25)
В результате если параметры при вызове процедуры не указаны, то процедура выполняется нормально,
но если пытаюсь передать хоть один параметр, процедура возвращает пустой запрос.

Автор: Deniz 21.9.2009, 11:40
Houl, можно попробовать вывести передаваемые параметры и проверить их.
Беглый взгляд показал, что условие отбора по периоду не корректно, ИМХО.
В результат не попадут записи, у которых "начало" (E.StartDate) раньше "начала периода" (@StartDate) и "конец" (E.FinishDate) больше "конца периода" (E.FinishDate).
Нужно так:
Код
...
where
  U1.Login like @login
and
  (@StartDate <= E.FinishDate) 
and
  (@FinishDate >= E.StartDate)
...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)