Группировать данные при измельчении xml на несколько таблиц на SQL-сервере
Это следует из этого вопроса:
Измените XML в SQL-сервере, чтобы добавить корневой узел
В дополнение к проблеме, поставленной и решаемой в этом вопросе, я также делю существующую таблицу на 2, где 2-я таблица - это подтаблица первой, а внешний ключ возвращается к первой.
Так что в настоящее время
table1(ID, col1, col2, col3....coln)
Это становится
table1(ID, col1, col2, col3)
а также
table2(PK, FK_table1, col4, col5, ...coln)
На данный момент я ничего не удалил из существующей таблицы, просто создал вторую, и я обнаружил конструкцию OUTPUT, так что я могу вставлять в обе таблицы одновременно, включая помещение PK первой таблицы во 2 как FK в 1 вкладыш - так что-то вроде;
INSERT INTO table1 col1, col2,...etc...
OUTPUT inserted.ID, col1, col2, ....
INTO table2(FK_table1, col1, col2, .... )
Select col.value('node1[1]', 'int') col1,
col.value('node2[1]', 'varchar(50)') col2,
....etc......
FROM @xml.nodes('//Items/Item') doc(col)
Это успешно вставляет в обе таблицы сразу, НО полагается на тот факт, что я еще не удалил столбцы из table1, ** И * приводит к соотношению 1:1 между таблицами, когда мне нужно, чтобы table1 просто имел строки для различных col1, col2, col3, с таблицей2, содержащей более подробную информацию
Мне интересно, правильно ли я поступлю? Я собираюсь быть в состоянии сделать это в 1 запросе, или я собираюсь сломать это? Я думаю, может быть, я мог бы сначала измельчить xml в table1, а затем снова отдельно в table2, присоединившись к table1, чтобы получить FK для вставки? Кто-нибудь делал такие вещи раньше?
1 ответ
Да, я сделал похожее и использовал оба предложения в зависимости от того, что мне нужно сделать
Опции:
Разрежьте XML один раз в табличную переменную SELECT DISTINCT из этой в table1, SELECT в table2
Измельчите XML дважды.
Я был бы склонен сделать дорогую операцию (измельчение XML) сначала за один раз.