【问题标题】:Convert XML to rows将 XML 转换为行
【发布时间】:2009-10-27 13:58:00
【问题描述】:

假设我将 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

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

【问题讨论】:

标签: sql-server xml


【解决方案1】:

使用 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 )    

【讨论】:

    【解决方案2】:

    只有一个指针...

    您需要对结果中所需的每一列进行显式 xpath 查询。您的查询是将 XML 中的 all 文本提取到单个列中。

    【讨论】:

      【解决方案3】:

      如果数字的长度都相同(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
      

      【讨论】:

      • 这不是在 SQL Server 中使用 XML 的好方法,当您拥有 XML 引擎的所有功能时,您将其视为字符串。
      猜你喜欢
      • 2014-07-20
      • 2018-04-18
      • 2013-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-08
      相关资源
      最近更新 更多