Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQLServer中使用“fromOpenXML”检索两个不同的XML标记_Sql Server_Xml_Stored Procedures_Openxml - Fatal编程技术网

Sql server 如何在SQLServer中使用“fromOpenXML”检索两个不同的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

我有这样一个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>
但是我还想在这个临时表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)