Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Вложенный запрос не выполняется если содержет больше 2-х вызовов функций  [new]
_BETEP_
Member

Откуда:
Сообщений: 3
Есть функция, которая вычитает одно значение в таблице из другого (считает выработанную активную мощность за сутки). Во вложенном запросе больше 2-х раз не выполняется. Сервер уходит в длительное ожидание.
Объясните столь странное поведение, пожалуйста.
Windows XP(SP3), MS SQL 2005 Standart

функция

IF EXISTS (SELECT * FROM sysobjects WHERE [name]='func_GenerateUsedForDay')
    DROP FUNCTION func_GenerateUsedForDay
GO
 
CREATE FUNCTION func_GenerateUsedForDay (@NUMBER INT, @dt datetime, @val VARCHAR(15))
RETURNS FLOAT
AS
BEGIN
DECLARE @dtOld datetime
SET @dtOld = dateadd(DAY,-1,@dt)
 
DECLARE @RESULT FLOAT
 
IF @val = 'ActivDirect'
SET @RESULT = ((SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dt) AND DATEADD(hh, 1, @dt)) AND NUMBER=@NUMBER)-
    (SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dtOld) AND DATEADD(hh, 1, @dtOld))  AND NUMBER=@NUMBER))
 
/*тут еще 3 таких же условия как и выше, убрал пока, чтоб не усложнять код (они не выполнятся)*/
RETURN @RESULT
END
GO


Вызвать хочу так
-- Это не работает..
SELECT (
(SELECT dbo.func_GenerateUsedForDay(1, '20130505  22:30', 'ActivDirect'))+
(SELECT dbo.func_GenerateUsedForDay(2, '20130505  22:30', 'ActivDirect'))+
(SELECT dbo.func_GenerateUsedForDay(3, '20130505  22:30', 'ActivDirect'))
)


А вот так работает
+
--Так работает
SELECT (
(SELECT dbo.func_GenerateUsedForDay(1, '20130505  22:30', 'ActivDirect'))+
(SELECT dbo.func_GenerateUsedForDay(2, '20130505  22:30', 'ActivDirect'))
)
 
--Так тоже работает
SELECT dbo.func_GenerateUsedForDay(1, '20130505  22:30', 'ActivDirect')
SELECT dbo.func_GenerateUsedForDay(2, '20130505  22:30', 'ActivDirect')
SELECT dbo.func_GenerateUsedForDay(3, '20130505  22:30', 'ActivDirect')
 


Разложил функцию
+
-- И так работает
DECLARE @val VARCHAR(15)
DECLARE @NUMBER INT
DECLARE @dt datetime
DECLARE @dtOld datetime
DECLARE @RESULT FLOAT
 
SET @val = 'ActivDirect'
SET @NUMBER = 2
SET @dt = '20130505 22:30' 
SET @dtOld = dateadd(DAY,-1,@dt)
 
SELECT
(
(SELECT
(
(SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dt) AND DATEADD(hh, 1, @dt)) AND NUMBER=@NUMBER)-
(SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dtOld) AND DATEADD(hh, 1, @dtOld))  AND NUMBER=@NUMBER)
))
+
(SELECT
(
(SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dt) AND DATEADD(hh, 1, @dt)) AND NUMBER=@NUMBER)-
(SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dtOld) AND DATEADD(hh, 1, @dtOld))  AND NUMBER=@NUMBER)
))
+
(SELECT
(
(SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dt) AND DATEADD(hh, 1, @dt)) AND NUMBER=@NUMBER)-
(SELECT top (1) ActivDirect FROM Energy WHERE ([TIME] BETWEEN DATEADD(hh, -1, @dtOld) AND DATEADD(hh, 1, @dtOld))  AND NUMBER=@NUMBER)
))
)


Запрос на создание таблицы (если понадобиться)
+
IF EXISTS (SELECT name FROM sysobjects 
   WHERE name = 'Energy' AND TYPE = 'U') 
DROP TABLE Energy
GO
 
CREATE TABLE Energy 
(
    NUMBER  INT NOT NULL,
    [TIME] datetime NOT NULL DEFAULT (getdate()),
    ActivDirect REAL,
    ActivBack REAL,
    ReactiveDirect REAL,
    ReactiveBack REAL
)
GO
 
ALTER TABLE Energy ADD PRIMARY KEY ([NUMBER],[TIME])
15 май 13, 12:50    [14298478]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос не выполняется если содержет больше 2-х вызовов функций  [new]
Glory
Member

Откуда:
Сообщений: 104760
_BETEP_
Windows XP(SP3), MS SQL 2005 Standart

Опубликуйте полную версию MS SQL
15 май 13, 12:51    [14298500]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос не выполняется если содержет больше 2-х вызовов функций  [new]
_BETEP_
Member

Откуда:
Сообщений: 3
Microsoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.1 (Build 2600: Service Pack 3)
15 май 13, 12:56    [14298556]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос не выполняется если содержет больше 2-х вызовов функций  [new]
Glory
Member

Откуда:
Сообщений: 104760
_BETEP_
Microsoft SQL Server 2005 - 9.00.1399.06

Сервис паки ??? Нет, не слыхал !
15 май 13, 13:01    [14298611]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос не выполняется если содержет больше 2-х вызовов функций  [new]
_BETEP_
Member

Откуда:
Сообщений: 3
Была установлена версия "SQL Server 2005 RTM (9.00.1399) [т.е. без сервис паков]
Проблема решилась после установки SP4.
Спасибо, большое :)
Поясните, начинающему разработчику суть проблемы. Почему так было?
16 май 13, 04:22    [14303014]     Ответить | Цитировать Сообщить модератору
 Re: Вложенный запрос не выполняется если содержет больше 2-х вызовов функций  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31438
_BETEP_
Поясните, начинающему разработчику суть проблемы. Почему так было?
Просто баг, который поправили в очередном SP
16 май 13, 09:00    [14303227]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить