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

Откуда:
Сообщений: 2
Приветствую всех на данном форуме!

Ребят, возник некоторый ступор. Прошу вашей помощи.

Есть код некоторой хранимки, которая формирует таблицу, именуем её [EventTable], используя данные из некоторых таблиц. На входе мы задаем кодовое обозначение года, за который хотим выгрузить данные. Нужно реализовать следующее: создать таблицу, которая будет содержать в себе сведения о пакете данных. Пакет данных - это запись в таблице [Packages], которая содержит в себе : ID пакета, EventOUID - идентификатор event'a и HandOutOUID - идентификатор записи из таблицы [HandOut], используя которую мы сформировали запись об event'e. Вопрос: Что написать в хранимке, которая будет создавать запись в таблице Packages со списком EventOUID, HandOutOUID и ID Пакета, при условии, что один пакет (с одним ID) содержит в себе множество OUID event'ов и HandOut'ов. Пример записи в таблице [Packages]:

--------------------------------------------
PackageOUID EventOUID HandOutOUID
--------------------------------------------
1 1 2
1 2 2
1 3 3
. . .
. . .

P.S. В одном несколько Event'ов могут подтягиваться из одного HandOut'a.

Ниже привожу пример реализации своей хранимки по формированию Event'ов. Хочу в неё добавить внесение данных в таблицу [Packages]. Каждый запуск хранимки - это формирование нового пакета с новым ID.

BEGIN
WITH HandOutTable AS 
(
	SELECT   
		HO.Ouid AS [ouid],   
		HO.Distribution AS [eventouid],   --- связь Need и HandOut по данному полю
		ISNULL(HO.Quantity, 0) AS [quantity],   
		HO.[Date] AS [datehandout],  
		HO.DateGive AS [dategive],   
		ISNULL(NK.Price, 0) AS [tsrprice],   
		ISNULL(KOMP.Z_Value, 0) AS [kompensationsum],   
		ISNULL(HO.[Money], 0) AS [ismoney],   
		HO.SendDate AS [datesend],   
		HO.SendDateInitial AS [datesendinitial] 
	FROM HandOut HO   
		INNER JOIN Need ND ON HO.Distribution = ND.Ouid  
		LEFT JOIN Kompensation KOMP ON HO.IdKompensation = KOMP.Ouid   
		LEFT JOIN NomenkAss NA ON HO.StateContract = NA.Ouid   
		LEFT JOIN Nomenklat NK ON NA.NomenkState = NK.Ouid
	WHERE HO.SendDate IS NULL AND ND.Kod = @yearcode
),

	NeedsTable  AS 
(
	SELECT ND.ouid, ND.Needs, ND.[Receive], ND.Direction, ND.Compensation, ND.Appeal, ND.DateStart, ND.DateFinal
	FROM Need ND JOIN HandOutTable HT ON ND.Ouid = HT.eventouid
),

	AppealsTable AS
(
	SELECT DISTINCT app.Ouid, app.W_SrokTo, app.Z_Date, app.Z_Kategor, app.Z_KatN, app.Z_TipN, app.Z_Tip, app.Z_Kol
	FROM Appeal app 
	JOIN NeedsTable ND ON ND.Appeal = app.Ouid
),

EventsTable AS 
(
	SELECT  
		ND.Ouid AS [ouid], 
		HO.Ouid AS [handoutouid], 
		ND.Needs AS [needs], 
		ND.[Receive] AS [receive], 
		ND.Direction AS [direction], 
		ND.Compensation AS [compensation], 
		ND.Appeal AS [docouid], 
		CASE WHEN APP.W_SrokTo IS NULL THEN 1 ELSE 0 END AS [isunlimited], 
		CASE WHEN RTSR2.Kod IS NOT NULL AND LEN(RTSR2.Kod) > 0 THEN 'TSRGroup2014' ELSE 'TSRGroup2013' END AS [tsrgroup], 
		N'06' AS [docsection], 
		ND.DateStart AS [eventdatestart], 
		ND.DateFinal AS [eventdatefinal], 
		NULL AS [tsrprice], 
		NULL AS [compensationsum], 
		APP.Z_Date AS [applicationdate], 
		CASE WHEN RTSR2.Kod = '99-99' THEN '36-002' ELSE '36-001' END AS [eventcode], 
		CASE WHEN RTSR2.Kod IS NOT NULL AND LEN(RTSR2.Kod) > 0  
		THEN CASE WHEN APP.Z_Kategor < 10 THEN '0' + CAST(APP.Z_Kategor AS NVARCHAR)  
		ELSE CAST(APP.Z_Kategor AS NVARCHAR) END  
		ELSE (CASE WHEN APP.Z_KatN < 10 THEN '0' ELSE '' END) + CAST(APP.Z_KatN AS NVARCHAR) END AS [tsrkindnumber], 
		CASE WHEN RTSR2.Kod IS NOT NULL AND LEN(RTSR2.Kod) > 0 THEN  
		CASE WHEN LEN(LEFT(RTSR2.Kod, CHARINDEX('-', RTSR2.Kod) - 1)) = 1  
		THEN '0' + RTSR2.Kod ELSE RTSR2.Kod END  
		ELSE (CASE WHEN APP.Z_KatN < 10 THEN '0' ELSE '' END) + CAST(APP.Z_KatN AS NVARCHAR) + '-' +  
		(CASE WHEN APP.Z_TipN < 10 THEN '0' ELSE '' END) + CAST(APP.Z_TipN AS NVARCHAR) END AS [tsrcode], 
		REPLACE(RTSR2.Name, '(старый справочник)', '') AS [tsrname], 
		0 AS [tsrcount],  
		NULL AS [tsrnamegive], 
		NULL AS [dategive], 
		N'03' AS [eventstatus], 
		NULL AS [nonexecreason], 
		NULL AS [execpercent], 
		CASE WHEN RTSR2.Kod = '99-99' THEN '1' ELSE NULL END AS [languageinterpretation],  
		CASE WHEN RTSR2.Kod = '99-99' THEN APP.Z_Kol ELSE NULL END AS [hourscount], 
		NULL AS [hourpriceinitial], 
		NULL AS [hourpricenormal] 
		FROM NeedsTable ND  
		JOIN AppealsTable APP ON ND.Appeal = APP.Ouid  
		LEFT JOIN ReferenceTsr2 RTSR2 ON APP.Z_Kategor = RTSR2.TsrSpr1 AND APP.Z_Tip = RTSR2.TsrSpr2
		JOIN HandOutTable HO ON HO.eventouid = ND.Ouid		
)


/* SELECT*FROM EventsTable; */

END


Сообщение было отредактировано: 19 май 17, 17:30
19 май 17, 12:15    [20495781]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи о пакете в отдельной таблице  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 7396
grendelius,

Вы задавайте вопрос, не углубляясь в делали, вырванные из контекста. Что не конкретно получается?
19 май 17, 13:09    [20496150]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи о пакете в отдельной таблице  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 30759
grendelius
Что написать в хранимке, которая будет создавать запись в таблице Packages
Непонятно ваше затруднение.
Создание записей делается командой INSERT.
Какие то ещё вопросы?
19 май 17, 17:19    [20497191]     Ответить | Цитировать Сообщить модератору
 Re: Создание записи о пакете в отдельной таблице  [new]
grendelius
Member

Откуда:
Сообщений: 2
Проблема была в видимости табличных представлений. После вставки в пакет после всех выборок INSERT'а, не мог обратиться к некоторым табличным представлениям. Решил проблему с помощью локальных табличных переменных. Спасибо за уделенное время!
22 май 17, 08:26    [20500184]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить