我正在尝试将我的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>
答案 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