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

Откуда: Барнаул
Сообщений: 26
Здравствуйте, уважаемые.
Такая проблема: есть запрос, имеющий рекурсивные подзапросы. Нужно внутри хранимой процедуры сохранить результат данного запроса в таблицу. Используется MS SQL Server 2005.
Таблица:
declare @T table 
(
	ID_Distr binary(16),		-- ИД дистрибьютора
	ID_Agent varchar(50),		-- ИД торгпреда
	AgentName varchar(100),		-- Имя торгпреда
	KategName varchar(100),		-- Название категории номенклатуры
	GroupName varchar(100),		-- Название группы номенклатуры
	NomName varchar(100),		-- Название номенклатуры
	PriceTypeName varchar(100),	-- Название типа цены
	ID_Nom varchar(50),			-- ИД номенклатуры
	Ostatok int,				-- Остаток на складе
	Price decimal(19,9),		-- Актуальная цена номенклатуры
	MarkUp decimal(19,9),		-- Наценка номенклатуры
	Weight money,				-- Масса базовой единицы измерения
	ID_PriceType varchar(50),	-- ИД типа цены номенклатуры
	KategIndex int,				-- Целочисленный ИД категории номенклатуры
	GroupIndex int,				-- Целочисленный ИД группы номенклатуры
	ID_Group varchar(50),		-- ИД группы товара
	NDS binary(16),				-- ИД НДС
	KoefBox int ,				-- Коэффициент пересчёта для коробки с товаром
	KoefBlock int,				-- Коэффициент пересчёта для блока с товаром
	ID_BaseEdIzm varchar(50),	-- ИД базовой единицы измерения
	ID_Kateg varchar(50),		-- ИД категории товара
	ID_Store varchar(50)		-- ИД склада вэн агента
)


Надо чтобы было что - то вроде:
insert into T <результат_запроса>, однако я не знаю, куда девать 2 рекурсивных подзапроса, потому что они объявлены в секции WITH, а, чтобы вставить данные в таблицу посредством запроса, нужно, чтобы он начинался с ключевого слова SELECT.
Запрос, результат которого надо поместить в таблицу:


-- ОБЪЯВЛЕНИЕ ИМЕНОВАННЫХ ЗАПРОСОВ
WITH 
   StoresOfAgents (ID_Store, ID_Parent) -- Выбирает склады агентов
     AS (	-- Выбрать номенклатуру, соответствующую списку товаров агентов
		 SELECT Nom._Fld928RRef as ID_Store, -- ИД Склада номенклатуры
				Nom._ParentIDRRef as Parent -- ИД родителя номенклатуры
		  FROM _Reference26 Nom,			 -- Таблица "Номенклатура"
			   ( -- Wares -- Выбрать товары торгпредов
				select distinct	
					   WaresOfAgent._Fld239RRef as ID_Nom	-- ИД номенклатуры товара
				  from _Reference52 WaresOfAgent,	-- Таблица "Товары агента"
					   ( -- TP -- Выбрать торгпредов доставки и лебедяня
							select TorgPred._Fld152RRef as ID_Agent	-- ИД агента, которому соответствует торгпред
							 from _Reference25 TorgPred	-- Таблица "Торговые представители"								   
							where (TorgPred._Fld157RRef = 0x90319331F5A6306F48BEDE535499013A	-- Торгпреды доставки
								  or TorgPred._Fld157RRef = 0xB45E7FAED4EF35AC474A722C0E804216)	-- Торгпреды лебедяня
							  and TorgPred._Marked = 0	-- Не помечен на удаление
							  and TorgPred._Folder = 1	-- Не группа
					  ) TP	-- Виртуальная таблица "Торгпреды дистрибьюторов"
				where WaresOfAgent._OwnerIDRRef = TP.ID_Agent	-- Привязка товара к агенту 
			   ) Wares	-- Виртуальная таблица "Группы товаров заданных торгпредов"
			where Nom._IDRRef = Wares.ID_Nom	-- Привязка номенклатуры к товару агента

		 union all

		-- Рекурсия
		select Nom._Fld928RRef as ID_Store,	-- ИД склада номенклатуры
			   Nom._ParentIDRRef as Parent	-- ИД родителя номенклатуры
		 from _Reference26 Nom				-- Таблица "Номенклатура"
        inner join StoresOfAgents SOA		-- Рекурсивный обход древовидной иерархии
           on SOA.ID_Parent = Nom._IDRRef	-- Привязка ИД склада, полученного на предыдущей итерации
											-- рекурсии, к родителю на текущей итерации
		where SOA.ID_Store = 0x00000000000000000000000000000000	-- Выбирать рекурсивно пока в записи,
																-- полученной на прошлой итерации,
																-- не проставлен склад
),

WaresOfAgents (ID_Nom, IsNotGroup, NomName, GrandParent)	-- Выбирает товары, которыми торгуют агенты
as
	(-- Выбрать товары торгпредов
		select distinct	
			   WaresOfAgent._Fld239RRef as ID_Nom,	-- ИД номенклатуры группы товара
			   Nom._Folder as IsNotGroup,			-- Признак группы (1 - выбранная запись не группа, 0 - группа)
			   Nom._Description as NomName,			-- Название номенклатуры
			   Nom._IDRRef as GrandParent			-- ИД номенклатуры, к которой привязан торгпред
				--Nom._Description as GrandParentName
		  from ( -- TP -- Выбрать торгпредов доставки и лебедяня
					select TorgPred._Fld152RRef as ID_Agent	-- ИД агента, которому соответствует торгпред
					 from _Reference25 TorgPred	-- Таблица "Торговые представители"						  
					where (TorgPred._Fld157RRef = 0x90319331F5A6306F48BEDE535499013A	-- Торгпреды доставки
						  or TorgPred._Fld157RRef = 0xB45E7FAED4EF35AC474A722C0E804216)	-- Торгпреды лебедяня
					  and TorgPred._Marked = 0	-- Не помечен на удаление
					  and TorgPred._Folder = 1	-- Не группа
			  ) TP,	-- Виртуальная таблица "Торгпреды дистрибьюторов"
			  _Reference52 WaresOfAgent,	-- Таблица "Товары агента"			   
			  _Reference26 Nom				-- Таблица "Номенклатура"
		where WaresOfAgent._OwnerIDRRef = TP.ID_Agent	-- Привязка товара к агенту 
		  and Nom._IDRRef = WaresOfAgent._Fld239RRef	-- Привязка номенклатуры к товарам агента
		  and not upper(Nom._Description) like '%ЪЪЪ%'	-- Катюша не вкатала 3 твёрдых знака в название номенклатуры :)

		union all

	   -- Рекурсия
	   select Nom._IDRRef as ID_Nom,		-- ИД номенклатуры
			  Nom._Folder as IsNotGroup,	-- Признак группы (1 - выбранная запись не группа, 0 - группа)
			  Nom._Description as NomName,	-- Название номенклатуры
			  WOA.GrandParent				-- ИД номенклатуры, к которой привязан торгпред
		 from _Reference26 Nom				-- Таблица "Номенклатура"
		INNER JOIN WaresOfAgents WOA		-- Рекурсивный обход древовидной иерархии
		   ON WOA.ID_Nom = Nom._ParentIDRRef	-- Привязка ИД номенклатуры с текущей итерации к 
												-- ИД предка с предыдущей итерации
		where not upper(Nom._Description) like '%ЪЪЪ%'	-- Катюша не вкатала 3 твёрдых знака в название номенклатуры :)
	)
-- КОНЕЦ ОБЪЯВЛЕНИЯ ИМЕНОВАННЫХ ЗАПРОСОВ


-- Выбрать -- Выбрать индекс и название категории товара и группы товара, а также сам товар
select Nom.ID_Distr,		-- ИД дистрибьютора
	   Nom.ID_Agent,		-- ИД торгпреда
	   Nom.AgentName,		-- Имя торгпреда
	   KategOfNom._Description as KategName,	-- Название категории номенклатуры
	   Nom.GroupName,		-- Название группы номенклатуры
	   Nom.NomName,			-- Название номенклатуры
	   Nom.PriceTypeName,	-- Название типа цены
	   Nom.ID_Nom,			-- ИД номенклатуры
	   Nom.Ostatok,			-- Остаток на складе
	   Nom.Price,			-- Актуальная цена номенклатуры
	   Nom.MarkUp,			-- Наценка номенклатуры
	   Nom.Weight,			-- Масса базовой единицы измерения
	   Nom.ID_PriceType,	-- ИД типа цены номенклатуры
	   UnitIndex._Fld1951 as KategIndex,	-- Целочисленный ИД категории номенклатуры
	   Nom.GroupIndex,						-- Целочисленный ИД группы номенклатуры
	   Nom.ID_Group,		-- ИД группы товара
	   Nom.NDS,				-- ИД НДС
	   Nom.KoefBox,			-- Коэффициент пересчёта для коробки с товаром
	   Nom.KoefBlock,		-- Коэффициент пересчёта для блока с товаром
	   Nom.ID_BaseEdIzm,	-- ИД базовой единицы измерения
	   KategOfNom._IDRRef as ID_Kateg,		-- ИД категории товара
	   Stores.ID_Store		-- ИД склада вэн агента

  from (-- Nom -- Выбрать индекс и название группы товара и сам товар
		select Nom.ID_Distr,		-- ИД дистрибьютора
			   Nom.ID_Agent,		-- ИД торгпреда
			   Nom.AgentName,		-- Имя торгпреда
			   Nom.NomName,			-- Название номенклатуры
			   Nom.ID_Nom,			-- ИД номенклатуры
			   Nom.Ostatok,			-- Остаток на складе
			   Nom.Price,			-- Актуальная цена номенклатуры
			   Nom.MarkUp,			-- Наценка номенклатуры
			   Nom.Weight,			-- Масса базовой единицы измерения
			   Nom.ID_PriceType,	-- ИД типа цены номенклатуры
			   Nom.NDS,				-- ИД НДС
			   Nom.KoefBox,			-- Коэффициент пересчёта для коробки с товаром
			   Nom.KoefBlock,		-- Коэффициент пересчёта для блока с товаром
			   Nom.ID_BaseEdIzm,	-- ИД базовой единицы измерения
			   Nom.PriceTypeName,	-- Название типа цены
			   GroupOfNom._Description as GroupName,	-- Название группы номенклатуры
			   UnitIndex._Fld1951 as GroupIndex,		-- Целочисленный ИД группы номенклатуры
			   GroupOfNom._ParentIDRRef as Parent,		-- ИД категории товара
			   GroupOfNom._IDRRef as ID_Group			-- ИД группы товара
			   
		  from (-- Nom -- Выбрать товары, их цену, остаток на складе
				select distinct
					   TP.ID_Distr,						-- ИД дистрибьютора
					   TP.ID_Agent,						-- ИД торгпреда
					   TP.AgentName,					-- Имя торгпреда
					   MaxPeriods.NomName,				-- Название номенклатуры
					   MaxPeriods.ID_Nom,				-- ИД номенклатуры
					   MaxPeriods.Ostatok,				-- Остаток номенклатуры на складе
					   Prices._Fld529 as Price,			-- Цена	номенклатуры
					   Prices._Fld531 as MarkUp,		-- Наценка, руб.
					   EdIzm._Fld117 as Weight,			-- Масса базовой единицы измерения
					   Prices._Fld527RRef as ID_PriceType,	-- ИД типа цены номенклатуры
					   Nom._ParentIDRRef as Parent,		-- ИД группы товара
					   EdIzmBox.KoefBox,				-- Коэффициент пересчёта для коробки с товаром
					   EdIzmBlock.KoefBlock,			-- Коэффициент пересчёта для блока с товаром
					   Nom._Fld162RRef as NDS,			-- ИД НДС
					   Nom._Fld163RRef as ID_BaseEdIzm,	-- ИД базовой единицы измерения
					   PriceTypes._Description as PriceTypeName		-- Название типа цены

				  from (-- MaxPeriods -- Выбрать записи о ценах номенклатуры с максимальными значениями периодов 
						select Prices._Fld528RRef as ID_Nom,	-- ИД номенклатуры
							   max(Prices._Period) as Period,	-- Максимальный период в группе
							   NomWithOst.NomName,				-- Название номенклатуры
							   NomWithOst.Ostatok,				-- Остаток на складе
							   Prices._Fld527RRef as ID_PriceType,	-- ИД типа цены номенклатуры
							   NomWithOst.GrandParent			-- ИД группы номенклатуры, к которой привязан торгпред

						  from (-- NomWithOst -- Выбрать не удалённую номенклатуру, которой торгуют заданные агенты
								-- и находящуюся на заданных складах, имеющую положительный остаток. 
								-- Выбрать дистрибьютора этой номенклатуры.
								select Wares.ID_Nom,				-- ИД номенклатуры
									   Wares.NomName,				-- Название номенклатуры
									   Wares.GrandParent,			-- ИД группы номенклатуры, к которой привязан торгпред
									   Sum (IsNull (Ost._Fld544, 0)) as Ostatok		-- Остаток на складе

								  from _AccumRegTotals548 Ost,		-- Таблица "итогов для регистра накопления 
																	-- "Партии товаров на складах" "
									   (-- Stores -- Выбрать ИД склада и дистрибьютора номенклатуры, у которой заполнено поле ИД склада
										select distinct 
											   SOA.ID_Store			-- ИД склада
										  from StoresOfAgents SOA	-- Виртуальная таблица "Склады агентов"
										 where SOA.ID_Store <> 0x00000000000000000000000000000000	-- ИД склада должен быть задан

										UNION

										-- Выбрать все склады вэн агентов
										select Stores._IDRRef as ID_Store	-- ИД склада
										  from _Reference37 Stores,			-- Таблица складов
											   ( -- Выбрать торгпредов доставки и лебедяня, у которых указан склад
												select TorgPred._Fld155RRef as ID_Store	-- ИД склада
												  from _Reference25 TorgPred	-- Таблица "Торговые представители"
												 where (TorgPred._Fld157RRef = 0x90319331F5A6306F48BEDE535499013A		-- Торгпреды доставки 
													   or TorgPred._Fld157RRef = 0xB45E7FAED4EF35AC474A722C0E804216)	-- Торгпреды Лебедянь
												   and TorgPred._Marked = 0		-- Не помечен на удаление
												   and TorgPred._Folder = 1		-- Не группа
												   and TorgPred._Fld155RRef <> 0x00000000000000000000000000000000	-- Указан склад
											   ) TP	-- Виртуальная таблица "Торгпреды дистрибьюторов"
										 where Stores._Fld1687 = 1	-- Склад является вэн агентом
										   and Stores._Marked = 0	-- Не помечен на удаление
										   and Stores._Folder = 1	-- Не группа
										   and Stores._IDRRef = TP.ID_Store	-- Привязка склада торгпреду
									   ) Stores,	-- Виртуальная таблица "Все склады агентов"
									   ( -- Wares -- Выбрать номенклатуру, которая является товарами заданных агентов
											select WOA.ID_Nom,		-- ИД номенклатуры
												   WOA.NomName,		-- Название номенклатуры
												   WOA.GrandParent	-- ИД группы номенклатуры, к которой привязан торгпред
												   --WOA.ID_Distr		-- ИД дистрибьютора
											  from WaresOfAgents WOA	-- Виртуальная таблица "Товары и группы товаров агентов"
											 where WOA.IsNotGroup = 1	-- Выбранные записи не являются группами
									   ) Wares	-- Виртуальная таблица "Товары, которыми торгуют агенты"
								where Ost._Fld537RRef = Stores.ID_Store	-- Остатки по выбранным складам
								  and Ost._Fld535RRef = Wares.ID_Nom	-- Остатки по выбранной номенклатуре
								  and Ost._Period = {ts '3999-11-01 00:00:00'}	-- Остатки за текущий период
								  and Ost._Fld543RRef = 0x9328F7DECE3D8FB541DFE9CB2C2D9794	-- Товар имеет статус "Свободный"
								group by Wares.ID_Nom,		-- Группировка по ИД номенклатуры,
										 Wares.NomName,		-- Имени номенклатуры
										 Wares.GrandParent	-- ИД номенклатуры, к которой привязан торгпред
							   ) NomWithOst,		-- Виртуальная таблица "Номенклатура с положительным остатком"
							   _InfoReg526 Prices	-- Таблица "Цены номенклатуры"
						 where Prices._Fld528RRef = NomWithOst.ID_Nom	-- Привязка цен номенклатуры к номенклатуре
						   and NomWithOst.Ostatok > 0					-- Порложительный остаток на складе для найденной номенклатуры
						 group by Prices._Fld528RRef,		-- ИД номенклатуры
								  NomWithOst.NomName,		-- Название номенклатуры
								  NomWithOst.Ostatok,		-- Остаток на складе
								  Prices._Fld527RRef,		-- ИД типа цены номенклатуры
								  NomWithOst.GrandParent	-- ИД группы номенклатуры, к которой привязан торгпред
					   ) MaxPeriods		-- Виртуальная таблица "Актуальные даты цен"

				  left join 
					   (-- Block -- Коэффициент пересчёта для блока номенклатуры
						select EdIzmBlock._OwnerIDRRef as Id_Nom,	-- ИД номенклатуры
							   EdIzmBlock._Fld120 as KoefBlock		-- Коэффициент пересчёта
						  from _Reference16 EdIzmBlock,				-- Таблица "Единицы измерения"
							   (-- Block -- ИД единицы измерения "Блок"
								select top 1 
									   Block._IDRRef as ID_Block	-- ИД единицы измерения
								  from _Reference19 Block			-- Таблица "Классификатор единиц измерения"
								 where upper(Block._Description) like 'БЛ%'	-- Единица измерения "Блок"
								   and Block._Marked = 0			-- Не помечена на удаление
							   ) Block		-- Виртуальная таблица "ИД единицы измерения "Блок""
						 where EdIzmBlock._Fld121RRef = Block.ID_Block	-- Выбор единицы измерения "Блок"
						   and EdIzmBlock._Marked = 0		-- Единица измерения не помечена на удаление
					   ) EdIzmBlock		-- Виртуальная таблица "Коэффициент пересчёта для блока номенклатуры"
					on EdIzmBlock.Id_Nom = MaxPeriods.ID_Nom	-- Привязка коэффициента пересчёта к номенклатуре

				  left join 
					   (-- Box -- Коэффициент пересчёта для коробки номенклатуры
						select EdIzmBox._OwnerIDRRef as Id_Nom,		-- ИД номенклатуры
						EdIzmBox._Fld120 as KoefBox					-- Коэффициент пересчёта
						  from _Reference16 EdIzmBox,				-- Таблица "Единицы измерения"
							   (-- Box -- ИД единицы измерения "Коробка"
								select top 1 
									   Box._IDRRef as ID_Box		-- ИД единицы измерения
								  from _Reference19 Box				-- Таблица "Классификатор единиц измерения"
								 where upper(Box._Description) like 'КОР%'		-- Единица измерения "Коробка"
								   and Box._Marked = 0				-- Не помечена на удаление
							   ) Box	-- Виртуальная таблица "ИД единицы измерения "Коробка""
						where EdIzmBox._Fld121RRef = Box.ID_Box	-- Выбор единицы измерения "Коробка"
						   and EdIzmBox._Marked = 0		-- Единица измерения не помечена на удаление
					   ) EdIzmBox		-- Виртуальная таблица "Коэффициент пересчёта для коробки номенклатуры"
					on EdIzmBox.Id_Nom = MaxPeriods.ID_Nom		-- Привязка коэффициента пересчёта к номенклатуре
					   
				  left join
					   (-- TP -- Выбрать торгпредов доставки и лебедяня, их тип цен, 
						-- ИД групп номенклатуры, которой они торгуют
						select distinct	
							   WaresOfAgent._Fld239RRef as ID_GroupOfNom,	-- ИД номенклатуры группы товара
							   TP.ID_Distr,							-- ИД дистрибьютора
							   TP.Id_Agent,							-- ИД торгпреда
							   TP.AgentName,						-- Имя торгпреда
							   TP.ID_PriceType						-- Тип цены торгпреда
						  from ( -- TP -- Выбрать торгпредов доставки и лебедяня
									select TorgPred._Fld152RRef as ID_Agent,	-- ИД агента, которому соответствует торгпред
										   TorgPred._Fld157RRef as ID_Distr,	-- ИД дистрибьютора
										   TorgPred._Description as AgentName,	-- Имя торгпреда
										   TorgPred._Fld1986RRef as ID_PriceType	-- Тип цены торгпреда
									 from _Reference25 TorgPred	-- Таблица "Торговые представители"
									where (TorgPred._Fld157RRef = 0x90319331F5A6306F48BEDE535499013A	-- Торгпреды доставки
										  or TorgPred._Fld157RRef = 0xB45E7FAED4EF35AC474A722C0E804216)	-- Торгпреды лебедяня
									  and TorgPred._Marked = 0	-- Не помечен на удаление
									  and TorgPred._Folder = 1	-- Не группа
							  ) TP,	-- Виртуальная таблица "Торгпреды дистрибьюторов"
							  _Reference52 WaresOfAgent	-- Таблица "Товары агента"			   
						where WaresOfAgent._OwnerIDRRef = TP.ID_Agent	-- Привязка товара к агенту
					   ) TP		-- Виртуальная таблица "Торгпреды доставки и лебедяня"
					on MaxPeriods.GrandParent = TP.ID_GroupOfNom	-- Привязка торгпредов к номенклатуре (по ИД номенклатуры)
				   and MaxPeriods.ID_PriceType = TP.ID_PriceType	-- Привязка торгпредов к номенклатуре (по типу цен)

				  left join _InfoReg526 Prices	-- Таблица "Цены номенклатуры"
					on Prices._Period = MaxPeriods.Period		-- Период цен номенклатуры должен быть актуальным
				   and Prices._Fld528RRef = MaxPeriods.ID_Nom	-- Привязка цен номенклатуры к номенклатуре
				   and Prices._Fld527RRef = TP.ID_PriceType		-- Привязка цен номенклатуры к типу цен

				  left join _Reference16 EdIzm	-- Таблица "Единицы измерения"
					on EdIzm._IDRRef = Prices._Fld530RRef,		-- Привязка единиц измерения к номенклатуре

					   _Reference26 Nom,	-- Таблица "Номенклатура"
					   _Reference51 PriceTypes	-- Таблица "Типы цен"
				 where Nom._IDRRef = MaxPeriods.ID_Nom	-- Привязка номенклатуры к выборке
				   and PriceTypes._IDRRef = Prices._Fld527RRef	-- Привязка типов цен к выборке
			   ) Nom,	-- Виртуальная таблица "Товары, их цены, остаток"
			   _Reference26 GroupOfNom	-- Таблица "Номенклатура" (из неё выбираются группы товаров)
		  left join 
			   _InfoReg1947 UnitIndex	-- Численный УИД групп и категорий товаров
			on UnitIndex._Fld1949RRef = GroupOfNom._IDRRef	-- Привязка численного УИД к группам товаров
			   
		 where GroupOfNom._IDRRef = Nom.Parent			-- Привязка групп товаров к номенклатуре
		   and UnitIndex._Fld1948RRef = Nom.ID_Distr	-- Привязка численного УИД к дистрибьютору
	   ) Nom	-- Виртуальная таблица "Товары и группы товаров"

  left join   
	   (-- Выбрать все склады вэн агентов
		select Stores._IDRRef as ID_Store,	-- ИД склада
			   TP.ID_Agent	-- ИД агента, которому соответствует торгпред
		  from _Reference37 Stores,			-- Таблица складов
			   ( -- Выбрать торгпредов доставки и лебедяня, у которых указан склад
				select TorgPred._Fld155RRef as ID_Store,	-- ИД склада
					   TorgPred._Fld152RRef as ID_Agent	-- ИД агента, которому соответствует торгпред
				  from _Reference25 TorgPred	-- Таблица "Торговые представители"
				 where (TorgPred._Fld157RRef = 0x90319331F5A6306F48BEDE535499013A		-- Торгпреды доставки 
					   or TorgPred._Fld157RRef = 0xB45E7FAED4EF35AC474A722C0E804216)	-- Торгпреды Лебедянь
				   and TorgPred._Marked = 0		-- Не помечен на удаление
				   and TorgPred._Folder = 1		-- Не группа
				   and TorgPred._Fld155RRef <> 0x00000000000000000000000000000000	-- Указан склад
			   ) TP	-- Виртуальная таблица "Торгпреды дистрибьюторов"
		 where Stores._Fld1687 = 1	-- Склад вэн агента
		   and Stores._Marked = 0	-- Не помечен на удаление
		   and Stores._Folder = 1	-- Не группа
		   and Stores._IDRRef = TP.ID_Store	-- Привязка склада торгпреду
	   ) Stores	-- Виртуальная таблица "Склады вэн агентов"
	on Nom.ID_Agent = Stores.ID_Agent,	-- Привязка складов вэн агентов ко всем агентам

	   _Reference26 KategOfNom	-- Таблица "Номенклатура" (из неё выбираются категории товаров)

  left join 
	   _InfoReg1947 UnitIndex	-- Численный УИД групп и категорий товаров
    on UnitIndex._Fld1949RRef = KategOfNom._IDRRef	-- Привязка численного УИД к категориям товаров

  
 where KategOfNom._IDRRef = Nom.Parent				-- Привязка категорий товаров к номенклатуре
   and UnitIndex._Fld1948RRef = Nom.ID_Distr		-- Привязка численного УИД к дистрибьютору
order by Nom.ID_Distr,				-- Сортировка по дистрибьютору, 
		 Nom.AgentName,				-- имени торгпреда,
		 KategOfNom._Description,	-- названию категории товара,
		 Nom.GroupName,				-- названию группы товара,
		 Nom.NomName				-- названию товара.
11 сен 09, 08:10    [7645693]     Ответить | Цитировать Сообщить модератору
 Re: Как поместить результат рекурсивного запроса во временную таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

-- КОНЕЦ ОБЪЯВЛЕНИЯ ИМЕНОВАННЫХ ЗАПРОСОВ

insert into ...
-- Выбрать -- Выбрать индекс и название категории товара и группы товара, а также сам товар

Posted via ActualForum NNTP Server 1.4

11 сен 09, 08:15    [7645698]     Ответить | Цитировать Сообщить модератору
 Re: Как поместить результат рекурсивного запроса во временную таблицу?  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
Вы имеете в виду так:

ALTER PROCEDURE DataExchange 
AS
BEGIN


declare @T table 
(
	ID_Distr binary(16),		-- ИД дистрибьютора
	ID_Agent varchar(50),		-- ИД торгпреда
	AgentName varchar(100),		-- Имя торгпреда
	KategName varchar(100),		-- Название категории номенклатуры
	GroupName varchar(100),		-- Название группы номенклатуры
	NomName varchar(100),		-- Название номенклатуры
	PriceTypeName varchar(100),	-- Название типа цены
	ID_Nom varchar(50),			-- ИД номенклатуры
	Ostatok int,				-- Остаток на складе
	Price decimal(19,9),		-- Актуальная цена номенклатуры
	MarkUp decimal(19,9),		-- Наценка номенклатуры
	Weight money,				-- Масса базовой единицы измерения
	ID_PriceType varchar(50),	-- ИД типа цены номенклатуры
	KategIndex int,				-- Целочисленный ИД категории номенклатуры
	GroupIndex int,				-- Целочисленный ИД группы номенклатуры
	ID_Group varchar(50),		-- ИД группы товара
	NDS binary(16),				-- ИД НДС
	KoefBox int ,				-- Коэффициент пересчёта для коробки с товаром
	KoefBlock int,				-- Коэффициент пересчёта для блока с товаром
	ID_BaseEdIzm varchar(50),	-- ИД базовой единицы измерения
	ID_Kateg varchar(50),		-- ИД категории товара
	ID_Store varchar(50)		-- ИД склада вэн агента
);

--------------------ВЫБОРКА ДАННЫХ ПО НОМЕНКЛАТУРЕ ДЛЯ ВЫГРУЗКИ--------------------
Print ('Начало выборки данных по номенклатуре, агентам: ' + cast(getdate() as nvarchar (20)))
-- ОБЪЯВЛЕНИЕ ИМЕНОВАННЫХ ЗАПРОСОВ
WITH 
   StoresOfAgents (ID_Store, ID_Parent) -- Выбирает склады агентов
     AS (	-- Выбрать номенклатуру, соответствующую списку товаров агентов
		 SELECT Nom._Fld928RRef as ID_Store, -- ИД Склада номенклатуры
				Nom._ParentIDRRef as Parent -- ИД родителя номенклатуры
		  FROM _Reference26 Nom,			 -- Таблица "Номенклатура"
			   ( -- Wares -- Выбрать товары торгпредов
				select distinct	
					   WaresOfAgent._Fld239RRef as ID_Nom	-- ИД номенклатуры товара
				  from _Reference52 WaresOfAgent,	-- Таблица "Товары агента"
					   ( -- TP -- Выбрать торгпредов доставки и лебедяня
							select TorgPred._Fld152RRef as ID_Agent	-- ИД агента, которому соответствует торгпред
							 from _Reference25 TorgPred	-- Таблица "Торговые представители"								   
							where (TorgPred._Fld157RRef = 0x90319331F5A6306F48BEDE535499013A	-- Торгпреды доставки
								  or TorgPred._Fld157RRef = 0xB45E7FAED4EF35AC474A722C0E804216)	-- Торгпреды лебедяня
							  and TorgPred._Marked = 0	-- Не помечен на удаление
							  and TorgPred._Folder = 1	-- Не группа
					  ) TP	-- Виртуальная таблица "Торгпреды дистрибьюторов"
				where WaresOfAgent._OwnerIDRRef = TP.ID_Agent	-- Привязка товара к агенту 
			   ) Wares	-- Виртуальная таблица "Группы товаров заданных торгпредов"
			where Nom._IDRRef = Wares.ID_Nom	-- Привязка номенклатуры к товару агента

		 union all

		-- Рекурсия
		select Nom._Fld928RRef as ID_Store,	-- ИД склада номенклатуры
			   Nom._ParentIDRRef as Parent	-- ИД родителя номенклатуры
		 from _Reference26 Nom				-- Таблица "Номенклатура"
        inner join StoresOfAgents SOA		-- Рекурсивный обход древовидной иерархии
           on SOA.ID_Parent = Nom._IDRRef	-- Привязка ИД склада, полученного на предыдущей итерации
											-- рекурсии, к родителю на текущей итерации
		where SOA.ID_Store = 0x00000000000000000000000000000000	-- Выбирать рекурсивно пока в записи,
																-- полученной на прошлой итерации,
																-- не проставлен склад
),

WaresOfAgents (ID_Nom, IsNotGroup, NomName, GrandParent)	-- Выбирает товары, которыми торгуют агенты
as
	(-- Выбрать товары торгпредов
		select distinct	
			   WaresOfAgent._Fld239RRef as ID_Nom,	-- ИД номенклатуры группы товара
			   Nom._Folder as IsNotGroup,			-- Признак группы (1 - выбранная запись не группа, 0 - группа)
			   Nom._Description as NomName,			-- Название номенклатуры
			   Nom._IDRRef as GrandParent			-- ИД номенклатуры, к которой привязан торгпред
				--Nom._Description as GrandParentName
		  from ( -- TP -- Выбрать торгпредов доставки и лебедяня
					select TorgPred._Fld152RRef as ID_Agent	-- ИД агента, которому соответствует торгпред
					 from _Reference25 TorgPred	-- Таблица "Торговые представители"						  
					where (TorgPred._Fld157RRef = 0x90319331F5A6306F48BEDE535499013A	-- Торгпреды доставки
						  or TorgPred._Fld157RRef = 0xB45E7FAED4EF35AC474A722C0E804216)	-- Торгпреды лебедяня
					  and TorgPred._Marked = 0	-- Не помечен на удаление
					  and TorgPred._Folder = 1	-- Не группа
			  ) TP,	-- Виртуальная таблица "Торгпреды дистрибьюторов"
			  _Reference52 WaresOfAgent,	-- Таблица "Товары агента"			   
			  _Reference26 Nom				-- Таблица "Номенклатура"
		where WaresOfAgent._OwnerIDRRef = TP.ID_Agent	-- Привязка товара к агенту 
		  and Nom._IDRRef = WaresOfAgent._Fld239RRef	-- Привязка номенклатуры к товарам агента
		  and not upper(Nom._Description) like '%ЪЪЪ%'	-- Катюша не вкатала 3 твёрдых знака в название номенклатуры :)

		union all

	   -- Рекурсия
	   select Nom._IDRRef as ID_Nom,		-- ИД номенклатуры
			  Nom._Folder as IsNotGroup,	-- Признак группы (1 - выбранная запись не группа, 0 - группа)
			  Nom._Description as NomName,	-- Название номенклатуры
			  WOA.GrandParent				-- ИД номенклатуры, к которой привязан торгпред
		 from _Reference26 Nom				-- Таблица "Номенклатура"
		INNER JOIN WaresOfAgents WOA		-- Рекурсивный обход древовидной иерархии
		   ON WOA.ID_Nom = Nom._ParentIDRRef	-- Привязка ИД номенклатуры с текущей итерации к 
												-- ИД предка с предыдущей итерации
		where not upper(Nom._Description) like '%ЪЪЪ%'	-- Катюша не вкатала 3 твёрдых знака в название номенклатуры :)
	)
-- КОНЕЦ ОБЪЯВЛЕНИЯ ИМЕНОВАННЫХ ЗАПРОСОВ

insert into T 
-- Выбрать -- Выбрать индекс и название категории товара и группы товара, а также сам товар

Не работает. Говорит:
Msg 319, Level 15, State 1, Procedure DataExchange, Line 37
Неправильный синтаксис около ключевого слова "with". Если данная инструкция является обобщенным табличным выражением или предложением xmlnamespaces, предыдущую инструкцию необходимо завершать точкой с запятой.
Msg 102, Level 15, State 1, Procedure DataExchange, Line 71
Неправильный синтаксис около ",".
11 сен 09, 08:24    [7645708]     Ответить | Цитировать Сообщить модератору
 Re: Как поместить результат рекурсивного запроса во временную таблицу?  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3264
;WITH
11 сен 09, 08:35    [7645721]     Ответить | Цитировать Сообщить модератору
 Re: Как поместить результат рекурсивного запроса во временную таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Не работает. Говорит:
> Msg 319, Level 15, State 1, Procedure DataExchange, Line 37
> Неправильный синтаксис около ключевого слова "with". Если данная
> инструкция является обобщенным табличным выражением или предложением
> xmlnamespaces, предыдущую инструкцию необходимо завершать точкой с запятой.

ну, вы сообщение-то прочитайте. там все есть - даже рассказано, что сделать надо.

Posted via ActualForum NNTP Server 1.4

11 сен 09, 08:37    [7645725]     Ответить | Цитировать Сообщить модератору
 Re: Как поместить результат рекурсивного запроса во временную таблицу?  [new]
ppa32
Member

Откуда: Барнаул
Сообщений: 26
УРААА!!! Спасибо большое!!!!
11 сен 09, 08:39    [7645727]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить