将xml转换为表后获取空值?

时间:2015-09-28 16:26:44

标签: sql xml sql-server-2012-express

我正在尝试将我的xml文件转换为sql server中的表,但我在地址标记后得到空值。我做错了。

还可以正确更改列的名称以避免出现此错误:

"通过OPENQUERY和OPENROWSET获得的结果集中不允许使用重复的列名。列名"已创建"是重复的。"

SELECT *
FROM OPENXML (@hdoc, '/contacts/contact', 2) 
WITH 
(
.
.
.
.
.)

xml

    <contacts>
      <contact>
        <address></address>
        <sex nil="true"/>
        <marital-status-id nil="true"/>
        <letter-salutation nil="true"/>
        <first-name nil="true"/>
        <middle-name nil="true"/>
        <last-name nil="true"/>
        .
        .
        .
        <addresses>
          <address>
            <id></id>
            <is-primary>1</is-primary>
            <label></label>
            <street-1></street-1>
            .
            .
            .
          </address>
        </addresses>
        <phones>
          <phone>
            <id></id>
            <label>Phone</label>
            <digits></digits>
           .
           .
           .
          </phone>
          <phone>
            <id></id>
            <label></label>
            <digits></digits>
            .
            .
            .
          </phone>
        </phones>
        <emails>
          <email>
            <id></id>
            <is-primary>true</is-primary>
            .
            .
            .
          </email>
        </emails>
      </contact>
<contacts>

1 个答案:

答案 0 :(得分:0)

您提供的信息是不够的......假设您的XML已成功加载到XML变量中,您需要这样的事情(注意:您在给定示例中的结束标记是错误的,&#34 ; /&#34;缺少):

顺便说一句:你不会把这个&#34;填入一张桌子&#34;。地址,电话和电子邮件需要1:n子表。

从XML子节点获取信息的方式完全相同。阅读CROSS APPLY

;WITH MyXML_CTE AS
(
SELECT contact.oneContact.value('address[1]','varchar(max)') AS address
      ,contact.oneContact.value('sex[1]','varchar(max)') AS sex
      ,contact.oneContact.value('marital-status[1]','varchar(max)') AS [marital-status]
      ,contact.oneContact.value('letter-salutation[1]','varchar(max)') AS [letter-salutation]
      ,contact.oneContact.value('first-name[1]','varchar(max)') AS [first-name]
      ,contact.oneContact.value('middle-name[1]','varchar(max)') AS [middle-name]
      ,contact.oneContact.value('last-name[1]','varchar(max)') AS [last-name]
      ,contact.oneContact.query('addresses') AS addresses
      ,contact.oneContact.query('phones') AS phones   
      ,contact.oneContact.query('emails') AS emails   
FROM @contact.nodes('/contacts/contact') AS contact(oneContact)
)
SELECT * FROM MyXML_CTE