2009-10-27 125 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