Sql server 如何在SQLServer中使用“fromOpenXML”检索两个不同的XML标记
我有这样一个XML:Sql server 如何在SQLServer中使用“fromOpenXML”检索两个不同的XML标记,sql-server,xml,stored-procedures,openxml,Sql Server,Xml,Stored Procedures,Openxml,我有这样一个XML: <OWNER> <NAME>Lucas</NAME> <EMAIL>lucas@sample.com</EMAIL> <OWNER> <ITENS> <MEMBER Nitem="1"> <NAME>Alex</NAME> <EMAIL>ale
<OWNER>
<NAME>Lucas</NAME>
<EMAIL>lucas@sample.com</EMAIL>
<OWNER>
<ITENS>
<MEMBER Nitem="1">
<NAME>Alex</NAME>
<EMAIL>alex@sample.com</EMAIL>
</MEMBER>
<MEMBER Nitem="2">
<NAME>Jane</NAME>
<EMAIL>jane@sample.com</EMAIL>
</MEMBER>
<ITENS>
但是我还想在这个临时表Temp_XML中插入所有者值,它具有相同的属性、名称和电子邮件
我应该怎么做?试试这个-使用SQL Server 2005和更新版本中的本机XQuery支持:
DECLARE @Id_XML XML ='<OWNER>
<NAME>Lucas</NAME>
<EMAIL>lucas@sample.com</EMAIL>
</OWNER>
<ITENS>
<MEMBER Nitem="1">
<NAME>Alex</NAME>
<EMAIL>alex@sample.com</EMAIL>
</MEMBER>
<MEMBER Nitem="2">
<NAME>Jane</NAME>
<EMAIL>jane@sample.com</EMAIL>
</MEMBER>
</ITENS>'
SELECT
OwnerName = xc.value('(NAME)[1]', 'varchar(50)'),
OwnerEmail = xc.value('(EMAIL)[1]', 'varchar(250)'),
MemberItem = xc2.value('@Nitem', 'int'),
MemberName = xc2.value('(NAME)[1]', 'varchar(50)'),
MemberEMail = xc2.value('(EMAIL)[1]', 'varchar(250)')
FROM
@Id_XML.nodes('/OWNER') AS XT(XC)
CROSS APPLY
@Id_XML.nodes('/ITENS/MEMBER') AS XT2(XC2)
给出以下输出:
我尝试了另一种方法,效果也很好
INSERT INTO #Temp_XML(id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text)
SELECT id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text
FROM
OPENXML(@_IdXML,'//Member',2)
INSERT INTO #Temp_XML(id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text)
SELECT id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text
FROM
OPENXML(@_IdXML,'//Owner',2)
只需输入“//”和XML标记的名称,OPENXML就可以找到它并将值插入临时表中,这与标记在树上的位置无关。是的,它可以工作-但是通过使用//。。标记两次,您将有效地搜索整个XML文档两次——无论如何效率都不是很高……那么如何在一个标记中同时插入两个标记呢?所有者和成员。。。我看起来有点像OPENXML@_IdXML“//Member”或“//Owner”,2您知道如何使用OPENXML中的//Owner和//Member而不搜索两次XML吗?@Mucida:您不能-如果您使用//…,那么您将搜索整个文档-两次。
INSERT INTO #Temp_XML(id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text)
SELECT id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text
FROM
OPENXML(@_IdXML,'//Member',2)
INSERT INTO #Temp_XML(id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text)
SELECT id, parentid, nodetype, localname, prefix, namespaceuri, datatype, prev, text
FROM
OPENXML(@_IdXML,'//Owner',2)