Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2019, 19:18   #1
AleksFromBK
Новичок
Джуниор
 
Регистрация: 08.08.2019
Сообщений: 5
По умолчанию Объект WITH и более одного SELECT

Доброго всем здоровья, господа!
WITH не хочет работать более, чем с одним SELECT в одном теле.
Была скалярная функция (П_КаталогиЗаказов - это VIEW, @KodKataloga и @DefaultPeriod - параметры):
Код:
--возвращает среднюю периодичность заказа за указанный каталог
declare @t table ( N tinyint identity(1,1), OrderDate smalldatetime )
insert into @t
select top 7 ДатаЗаказа -- отбираю 7 последних заказов - см. order by ДатаЗаказа desc !
from dbo.П_КаталогиЗаказов (nolock) where КодКаталога = @KodKataloga order by ДатаЗаказа desc
	
declare @c tinyint
select @c = count(*) from @t -- число отобранных заказов
if @c < 2 return @DefaultPeriod

return datediff (dd, (select OrderDate from @t where N = @c), (select OrderDate from @t where N = 1))
		      / (@c - 1)  -- это число промежутков (периодов) между заказами
Функция используется в процедурах массовой обработки, поэтому решил упростить и ускорить код. Вот новая функция:
Код:
declare @c tinyint;
with k as (	select top 7 ДатаЗаказа from dbo.П_КаталогиЗаказов (nolock)
		where КодКаталога = @KodKataloga order by ДатаЗаказа desc  )
select @c = count(*) from k
if @c < 2 return @DefaultPeriod
return datediff (dd, (select top 1 ДатаЗаказа from k order by ДатаЗаказа), (select top 1 ДатаЗаказа from k))
		      / (@c - 1)
Синтаксический анализ проходит, инструкция ALTER FUNCTION выполняется без проблем, а выполнение функции даёт проблему: "Недопустимое имя объекта "k"."

При этом вот такой фрагмент работает (с сортировкой в SELECT и без оной):
Код:
with k as (	select top 7 ДатаЗаказа from dbo.П_КаталогиЗаказов (nolock)
			where КодКаталога = 436 order by ДатаЗаказа desc  )
select top 1 ДатаЗаказа from k order by ДатаЗаказа
Может кто-нибудь подсказать, в чём дело и как обойти засаду?
Заранее благодарен.
AleksFromBK вне форума Ответить с цитированием
Старый 24.11.2019, 20:11   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 19,042
По умолчанию

Цитата:
Сообщение от AleksFromBK Посмотреть сообщение
if @c < 2 return @DefaultPeriod
return datediff (dd, (select top 1 ДатаЗаказа from k order by ДатаЗаказа), (select top 1 ДатаЗаказа from k))
Это k здесь уже не известно. with закончился. Там где count(*) попробуй добавить min и max для даты заказа. Должно этого хватить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию

Последний раз редактировалось Аватар; 24.11.2019 в 20:17.
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Допускается ли более одного конструктора класса? Dmitry_B Общие вопросы C/C++ 10 27.11.2018 21:55
установить более одного глобального хоткея Snake22 C# (си шарп) 2 10.05.2013 01:57
Добавить в Grid более одного элемента coNsept WPF, UWP, WinRT, XAML 2 20.01.2013 21:28
Объект одного класса в конструкторе другого Benderbej PHP 5 13.02.2011 22:48
Запрет на загрузку более одного файла. MrJenika PHP 2 20.11.2010 21:37