2009-10-27 40 views
1

假设我已将xml存储在数据库中。它包含联系人的列表,像这样:将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> 

它存储在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] 

我想编写一个查询它将联系人元素转换为新表的行,并与联系人表的ID字段相匹配。

我已经试过这样:

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

但它从塔中给定的XML片段提取所有数据,并与该行的ID一起把它全部在一排,像这样:

号码,ID

7771234631123463522346352238,1500

当我想要得到的是这个:

号码,ID

7771234,1500

6311234,1500

6352234,1500

6352238,1500

你能指出我朝着正确的方向?

+0

除了公认的答案,这是有帮助的: http://blog.beyondrelational.com/2007/11/xml-workshop-v-reading-values-from-xml.html – Irwin 2009-11-10 14:20:00

回答

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)  
+0

好东西,谢谢你。 – Irwin 2009-10-27 14:54:04

0

指针只...

你需要为你的结果要每列一个明确的XPath查询。您所查询的是将全部从XML中的文本拖拽到一个列中。

0

如果数字都是相同的长度(7),尽量使用子

select 
substring((Cast(Request.query('/Person/Contact/text()') as varchar(100))),0,8) mobile, 
substring((Cast(Request.query('/Person/Contact/text()') as varchar(100))),8,16) home, 
substring((Cast(Request.query('/Person/Contact/text()') as varchar(100))),16,24) work, 
substring((Cast(Request.query('/Person/Contact/text()') as varchar(100))),24,32) fax, 
id 
from contacts 
+0

这不是在SQL Server中使用XML的好方法,如果您拥有可供您使用的XML引擎的全部功能,就可以像字符串一样对待它。 – 2016-06-06 16:34:04