Quantcast
Channel: SQL.ru: Microsoft SQL Server
Viewing all articles
Browse latest Browse all 7251

xml modify insert добавить идентификатор

$
0
0
Здравствуйте, помогите, пожалуйста, разобраться с задачей.
Есть вот такой xml:

DECLARE @x xml; 
SET @x = 
'<СТАЖ> 
                <Работник> 
                        <ФИО> 
                                <Фамилия>ИВАНОВ</Фамилия> 
                                <Имя>ИВАН</Имя> 
                                <Отчество>ИВАНОВИЧ</Отчество> 
                        </ФИО>                 
                        <Работа> 
                                <Период> 
                                        <С>2017-01-01</С> 
                                        <По>2017-09-10</По> 
                                </Период> 
                        </Работа> 
                        <Работа> 
                                <Период> 
                                        <С>2017-09-11</С> 
                                        <По>2017-10-08</По> 
                                </Период> 
                        </Работа> 
                </Работник> 
                <Работник> 
                        <ФИО> 
                                <Фамилия>ИВАНОВА</Фамилия> 
                                <Имя>МАРИЯ</Имя> 
                                <Отчество>СЕРГЕЕВНА</Отчество> 
                        </ФИО> 
                        <Работа> 
                                <Период> 
                                        <С>2017-01-01</С> 
                                        <По>2017-08-06</По> 
                                </Период> 
                        </Работа> 
                        <Работа> 
                                <Период> 
                                        <С>2017-08-07</С> 
                                        <По>2017-08-20</По> 
                                </Период> 
                        </Работа> 
                </Работник> 
</СТАЖ> 
'; 


Нужно добавить нумерацию в ноды с работниками и в ноды с периодами работы. Я делаю так:

declare @p int = 1, @c int; 
declare @str xml 

select @c = @x.query('count(//СТАЖ/Работник)').value('.', 'int'); 
while @p <= @c 
 begin 
   select @str='<Номер>'+cast(@p as varchar(2))+'</Номер>' 

  set @x.modify('insert sql:variable("@str") as first into (((//СТАЖ/Работник)[position() = sql:variable("@p")])[1])'); 
  select @p += 1; 
 end; 

select @x;


Идентификатор добавляется правильно. Теперь тот же метод применяю к периодам работы, но мне надо, чтобы для каждого работника нумерация периодов начиналась с 1. При таком коде она получается сквозной, то есть неправильной. Подскажите, плиз, как код исправить.

set @p=1 
select @c = @x.query('count(//СТАЖ/Работник/Работа)').value('.', 'int'); 
while @p <= @c 
 begin 
   select @str='<Номер>'+cast(@p as varchar(2))+'</Номер>' 

  set @x.modify('insert sql:variable("@str") as first into (((//СТАЖ/Работник/Работа)[position() = sql:variable("@p")])[1])'); 
  select @p += 1; 
 end; 


select @x;


И заодно еще один вопрос: можно ли такую модификацию выполнить без циклов? На маленьких xml это работает быстро, но на больших (200-300 тыс. записей), боюсь, будет тормозить.

Viewing all articles
Browse latest Browse all 7251

Trending Articles