powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / как правильно выбирать множество записей с созранением результата обрабтки?
2 сообщений из 2, страница 1 из 1
как правильно выбирать множество записей с созранением результата обрабтки?
    #35583938
Да, это я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Какое решение будет наиболее правильным?

ситуация:
есть сервис, читающий множество команд в формате xml посредством ХП.
При чтении им выставляется статус "В обработке". Далее этот сервис
пытается обработать команды.
Результат: успешно, неверная команда, непредусмотренная ошибка.
Обработка результата осуществляется следующим образом:
- непредусмотренная ошибка - вернуть всем командам статус "Активно",
- неверная команда - статус "Ошибка",
- успешная - статус "В обработке" не менять

1 вариант решения - ввести в таблицу Command доп поле get_session и писать
туда GUID при выборке нового множества команд. Тогда при непредусмотренной
ошибке можно легко сделать

Код: plaintext
update Command set state = 'A' where get_session = @saved_session. 

А при ошибке самого xml дергать вторую процедуру, но уже с ID команды:

Код: plaintext
update Command set state = 'E' where Id = @id

Чем не нравится - поле get_session логически не связано с таблицей Command.
Оно сервисное и нужно для функционирования некоего внешнего сервиса.
К тому же для сохранения результатов используются несколько ХП, каждое их
которых по своему доступается к данным. Справедливости ради отмечу,
что вероятность вызова таких процедур крайне мала.

2 вариант решения - сервис ведет у себя xml-документ с id командами и
статусом их исполнения
типа этого:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
	<info>
		<command>
			<id> 1 </id>
			<state>P</state>
		</command>
		...
		<command>
			<id> 7 </id>
			<state>E</state>
		</command>
		...
		<command>
			<id> 2 </id>
			<state>A</state>
		</command>
	</info>

а по окончании работы вызывается сохраняющая ХП:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
ALTER PROCEDURE [dbo].[set_command_state] 
	@commands xml
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

	with cte_ids as
	(
		select 
			t.c.value('(state)[1]', 'char(1)') state, 
			t.c.value('(id)[1]', 'int') id
		from 
			@commands.nodes('/info/command') t(c)
	)

	update dbo.Command
	set State = cte.state
	from dbo.Command cmd 
		inner join cte_ids cte on cmd.Id = cte.id
END

Смущает использование xml - кажется оно будет медленнее работать. И необходимость ведения дополнительного "лога" на сервисе. Зато доступ к данным будет единообразный


вот структура таблицы на всякий случай
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TABLE [dbo].[Command](
	[Id] [int] IDENTITY( 1 , 1 ) NOT NULL,
	[Request] [xml] NULL,
	[Response] [xml] NULL,
	[State] [char]( 1 ) NOT NULL,
	[last_update] [datetime] NOT NULL,
	[sys_user] [varchar]( 255 ) NOT NULL,
	[get_session] [varchar]( 255 ) NULL,
	[Target] [varchar]( 1000 ) NULL
)

Вот выборка команд из таблицы:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
ALTER PROCEDURE [dbo].[get_command_new] 
	@ServiceType varchar( 50 ) = 'B'		
AS
BEGIN
	declare @tmp_command_storage table 
		([Id] int not null, 
		 [Request] xml not null,
		 [RequestTime] datetime not null,
		 [Target] varchar( 255 ) not null)

	begin tran
		begin try
			insert into @tmp_command_storage
			select [Id]
				  ,[Request]
				  ,[RequestTime]
				  ,[Target]
			  from [dbo].[Command] c (UPDLOCK) 
			 where [Service] = Upper(@ServiceType)
			
			UPDATE [dbo].[Command]
			   SET [State] = 'P'
			 WHERE Command.Id in (select Id from @tmp_command_storage)
		end try
		begin catch
                        -- некая обработка ошибок
		end catch

	if @@TRANCOUNT >  0 
	commit tran

	select * from @tmp_command_storage
	return @@ROWCOUNT
END
...
Рейтинг: 0 / 0
как правильно выбирать множество записей с созранением результата обрабтки?
    #35584815
Да, это я
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное, слишком много букв.

Если коротко: что правильнее - получить набор записей и для каждой из них вызывать хранимку для сохранения результата обработки или лучше после обработки этого набора сформировать xml с результатами и однократным вызовом процедуры зафиксировать их?
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / как правильно выбирать множество записей с созранением результата обрабтки?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]