Здравствуйте, помогите, пожалуйста, разобраться с задачей.
Есть вот такой xml:
Нужно добавить нумерацию в ноды с работниками и в ноды с периодами работы. Я делаю так:
Идентификатор добавляется правильно. Теперь тот же метод применяю к периодам работы, но мне надо, чтобы для каждого работника нумерация периодов начиналась с 1. При таком коде она получается сквозной, то есть неправильной. Подскажите, плиз, как код исправить.
И заодно еще один вопрос: можно ли такую модификацию выполнить без циклов? На маленьких xml это работает быстро, но на больших (200-300 тыс. записей), боюсь, будет тормозить.
Есть вот такой 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 тыс. записей), боюсь, будет тормозить.