2012-03-24 58 views
1

我有一个XML一样,SQL - 获取子节点,并使用“for循环”与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字段。和第二个表(Table2)具有CustomerId,FirstName,LastName等字段。

此xml文档有多个子节点,如联系人。如何从此xml中获取节点值和子节点值,并且希望将此数据插入到Table1和Table2中。

注意:如果联系子节点出现2点的手段,我们将表2中插入两行..

回答

0

尝试是这样的:

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) 

输出是:

CustomerID FirstName LastName 
    1  david  lawr 
    1  john  peter 
+0

嗨@Marc_s ....是的,它工作正常...此查询仅我需要@@@@谢谢verymuch .. !!! ! – 2012-03-24 12:35:04