SQL - Получить дочерние узлы и использовать цикл for с типом данных XML - PullRequest
1 голос
/ 24 марта 2012

у меня есть один xml-подобный,

Declare @xmldata xml;
set @xmldata ='
<Customers>
  <Id>1</Id>
  <Name>foo</Name>      
  <UserName>TestUser</UserName>
  <Password>pwd</Password>
  <Contacts>
    <FirstName>david</FirstName>
    <LastName>lawr</LastName>        
  </Contacts>
  <Contacts>
     <FirstName>john</FirstName>
     <LastName>peter</LastName>         
  </Contacts>  
</Customers>';

Я хочу вставить вышеупомянутый XML-документ в таблицы 2 sql.В первой таблице (таблица 1) есть поля, такие как поля Id, Name, UserName, Password.и Вторая таблица (Таблица2) имеет такие поля, как CustomerId, FirstName, LastName.

Этот документ XML имеет более одного дочернего узла, например Контакты .Как получить значения Node и значения дочерних узлов из этого xml и добавить эти данные в Table1 и Table2.

Примечание. Если дочерний узел Contact приходит 2 раза,вставит 2 строки в Table2 ..

1 Ответ

0 голосов
/ 24 марта 2012

Попробуйте что-то вроде этого:

INSERT INTO dbo.FirstTable(CustomerID, CustomerName, UserName, Password)
    SELECT
        @xmldata.value('(/Customers/Id)[1]', 'int'),
        @xmldata.value('(/Customers/Name)[1]', 'varchar(50)'),
        @xmldata.value('(/Customers/UserName)[1]', 'varchar(50)'),
        @xmldata.value('(/Customers/Password)[1]', 'varchar(50)')

Вывод из оператора SELECT выглядит примерно так:

CustomerID  CustomerName   UserName  Password
     1        foo          TestUser  pwd

Второй запрос:

INSERT INTO dbo.SecondTable(CustomerID, FirstName, LastName)
    SELECT
        @xmldata.value('(/Customers/Id)[1]', 'int'),
        Cont.value('(FirstName)[1]', 'varchar(50)'),
        Cont.value('(LastName)[1]', 'varchar(50)')
    FROM
        @xmldata.nodes('/Customers/Contacts') AS Cust(Cont)

Выводиз этого SELECT есть:

CustomerID   FirstName  LastName
    1        david      lawr
    1        john       peter
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...