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

Откуда:
Сообщений: 69
Вытаскиваю Excel из базы - парсю его, получившийся xml отправляю на обработку в процедуру, которая вытаскивает данные, удаляет данные за ту же дату, что и в пришедшем xml и записывает сверху новые данные, записывая состояние обработано или ошибка. Самое интересное, что при обработке кучи файлов с разными именами все отлично. При наличии файлов с одинаковым именем если их обработка идет не последовательно, а есть файлы с другими именами, обрабатываемые между ними - все тоже ок. Но как только обрабатываются подряд 2 или более одинаковых файлов - первый записывается, второй и последующие стирают как и положено данные - а новые не записываются в принципе. Никто не подскажет, что это за магическая хрень?
Иксемели приходят одни и те же вполне рабочие.
	@data varchar(max)

  declare @source table(id int primary key, parent int, nodetype int, localname varchar(128), prev int, text varchar(2000))
  declare @idoc int,
		  @num	int = 1,
		  @command varchar(256),
		  @reason varchar(256),
		  @initiative varchar(256),
		  @node int,
		  @typeId int,
		  @accepted datetime, 
		  @started datetime, 
		  @finished datetime, 
		  @sendid uniqueidentifier, 
		  @rcvrid uniqueidentifier, 
		  @value float
  
  exec sp_xml_preparedocument @idoc output, @data
  
		insert into @source
			select id, parentid, nodetype, localname, prev, text				
			from openxml(@idoc, 'day/row', 0)

  exec sp_xml_removedocument @idoc
  
  declare @table table(date varchar(256), station varchar(256), date_accept varchar(256), date_start varchar(256), date_end varchar(256), command varchar(256), initiative varchar(256), value varchar(256), descr varchar(256))
  declare @result_table table(id int identity, date_accept varchar(256), date_start varchar(256), date_end varchar(256), date varchar(256), station varchar(256), command varchar(256), value varchar(256), initiative varchar(256), descr varchar(256))												
  insert into @table
  select 
		CAST(c_val.text as varchar(256)),
		CAST(d_val.text as varchar(256)),
		CAST(e_val.text as varchar(256)),
		CAST(f_val.text as varchar(256)),
		CAST(g_val.text as varchar(256)),
		CAST(h_val.text as varchar(256)),
		CAST(i_val.text as varchar(256)),
		CAST(j_val.text as varchar(256)),
		CAST(k_val.text as varchar(256))
  from @source as a
		inner join @source as b on b.parent = a.id
		inner join @source as c on c.parent = a.id and c.localname = 'date' 
			inner join @source as c_val on c_val.parent = c.id
		inner join @source as d on d.parent = a.id and d.localname = 'name' 
			inner join @source as d_val on d_val.parent = d.id 
		inner join @source as e on e.parent = a.id and e.localname = 'date_accept'
			inner join @source as e_val on e_val.parent = e.id
		inner join @source as f on f.parent = a.id and f.localname = 'date_start'
			inner join @source as f_val on f_val.parent = f.id
		inner join @source as g on g.parent = a.id and g.localname = 'date_end'
			inner join @source as g_val on g_val.parent = g.id
		inner join @source as h on h.parent = a.id and h.localname = 'command'
			left join @source as h_val on h_val.parent = h.id
		inner join @source as i on i.parent = a.id and i.localname = 'init'
			left join @source as i_val on i_val.parent = i.id	
		inner join @source as j on j.parent = a.id and j.localname = 'value'
			left join @source as j_val on j_val.parent = j.id
		inner join @source as k on k.parent = a.id and k.localname = 'descr'
			left join @source as k_val on k_val.parent = k.id

insert into @result_table
select distinct a.date_accept, a.date_start, a.date_end, a.date, a.station, a.command, a.value, a.initiative, a.descr from @table as a

while(@num <= (select COUNT(*) from @result_table))
	begin

		select @command = a.command from @result_table as a where a.id = @num
		select @reason = a.descr from @result_table as a where a.id = @num
		select @initiative = a.initiative from @result_table as a where a.id = @num
		select @node = (select node from dbo.c_extdocbind as a where a.name = (select station from @result_table where id = @num) and type = 1048794)

		select @typeId = id from dbo.a_odk as a_odk where a_odk.initiative in
													(select id from c_initiatives as c_init where c_init.code = @initiative)
											and a_odk.command = dbo.fn_odk_type_value(@command)										
											and a_odk.reason in 
													( select id from dbo.c_odk_glossary as c_reason where c_reason.name = @reason)
											and a_odk.remark = 95 	
											
		select @accepted = case when len(a.date_accept) = 5 then CAST(date +' '+ a.date_accept as datetime)
								else cast((select ('20' + SUBSTRING(a.date_accept,7,2) + SUBSTRING(a.date_accept,4,2) + SUBSTRING(a.date_accept,1,2) + ' ' + SUBSTRING(a.date_accept,10,5)))as datetime)
		                   end, 
			   @started  = case when len(a.date_accept) = 5 then CAST(date +' '+ a.date_start as datetime)
								else cast((select ('20' + SUBSTRING(a.date_start,7,2) + SUBSTRING(a.date_start,4,2) + SUBSTRING(a.date_start,1,2) + ' ' + SUBSTRING(a.date_start,10,5))) as datetime)
		                   end, 
			   @finished = case when len(a.date_end) = 5 then CAST(date +' '+ a.date_end as datetime)
								else cast((select ('20' + SUBSTRING(a.date_end,7,2) + SUBSTRING(a.date_end,4,2) + SUBSTRING(a.date_end,1,2) + ' ' + SUBSTRING(a.date_end,10,5))) as datetime)
		                   end,
			   @value = CAST(a.value as float)	   
			   from @result_table as a 
			   where a.id = @num
		if(@command = 'XYZ')
			begin 
				select @value = dbo.fn_XXX(@node, 107, @finished)
			end
		
		delete from dbo.XXX where accepted between @accepted and DATEADD(DAY,1,@accepted) and node = @node
	
		insert into dbo.XXX (id, node, type, accepted, started, finished, sender, receiver, value, descr, created, replver, repldir)
		          values (newid(), @node, @typeId, @accepted, @started, @finished, '', '', isnull(@value,0), null, getdate(), getdate(),0)		
		set @num = @num + 1
	end
17 июл 12, 17:44    [12879530]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить