将XML转换为行

Irw*_*win 1 xml sql-server

假设我已将xml存储在数据库中.它包含一个联系人列表,如下所示:

<Person>
 <Name>Irwin</Name>
 <Address>Home, In a place</Address>
 <Contact type="mobile">7771234</Contact>
 <Contact type="home">6311234</Contact>
 <Contact type="work">6352234</Contact>
 <Contact type="fax">6352238</Contact>
</Person>
Run Code Online (Sandbox Code Playgroud)

它存储在sql server数据库的xml列中,具有以下结构:

TABLE [Contacts](
 [ID] [bigint] IDENTITY(1,1) NOT NULL,
 [Info] [xml] NOT NULL,
 [Status] [tinyint] NOT NULL,
 [CreateTime] [datetime] NOT NULL,
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我想编写一个查询,将Contact元素转换为新表的行,与Contacts表的ID字段匹配.

我试过这个:

SELECT  Cast(Request.query('/Person/Contact/text()')  as varchar(100)) as [Number], ID 
FROM Contacts
Run Code Online (Sandbox Code Playgroud)

但它从列中的给定xml片段中提取所有数据,并将其与该行的ID一起放在一行中,如下所示:

编号,ID

7771234631123463522346352238,1500

当我想得到的是这个:

编号,ID

7771234,1500

6311234,1500

6352234,1500

6352238,1500

你能为我指出正确的方向吗?

Stu*_*rth 5

使用CROSS APPLY和xml方法

DECLARE @t TABLE ( ID INT, tag XML )

INSERT  INTO @t
        ( ID ,
          tag 
        )
VALUES  ( 1500 , -- ID - int
          '<Person> 
            <Name>Irwin</Name> 
            <Address>Home, In a place</Address> 
            <Contact type="mobile">7771234</Contact> 
            <Contact type="home">6311234</Contact> 
            <Contact type="work">6352234</Contact> 
            <Contact type="fax">6352238</Contact>
          </Person>'          
        ) 

SELECT  Number = Contact.value('.', 'varchar(MAX)') ,
        t.id
FROM    @t t
        CROSS APPLY tag.nodes('/Person/Contact') AS tag ( Contact )    
Run Code Online (Sandbox Code Playgroud)