Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.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 在SQL Server中交织XML段_Sql Server_Xml Parsing - Fatal编程技术网

Sql server 在SQL Server中交织XML段

Sql server 在SQL Server中交织XML段,sql-server,xml-parsing,Sql Server,Xml Parsing,我得到了两个始终成对的XML段,如: <root> <ZID>123</ZID> <ZID>456</ZID> <ZID>789</ZID> </root> <root> <ZTYPE>A</ZID> <ZTYPE>B</ZID> <ZTYPE>C</ZID> </root> 关于如何实现这一点的想法?

我得到了两个始终成对的XML段,如:

<root>
<ZID>123</ZID>
<ZID>456</ZID>
<ZID>789</ZID>
</root>

<root>
<ZTYPE>A</ZID>
<ZTYPE>B</ZID>
<ZTYPE>C</ZID>
</root>

关于如何实现这一点的想法?

一个带有正确XML的选项

Declare @XML1 xml = '<root><ZID>123</ZID><ZID>456</ZID><ZID>789</ZID></root>'
Declare @XML2 xml = '<root><ZTYPE>A</ZTYPE><ZTYPE>B</ZTYPE><ZTYPE>C</ZTYPE></root>'

Select A.ID
      ,B.Type
 From (
        Select RN=Row_Number() over (Order By (Select NULL))
              ,ID = f.n.value('(.)[1]','int') 
         From  @XML1.nodes('root') t(n)
         Cross Apply t.n.nodes('*') f(n)
      ) A
 Join (
        Select RN=Row_Number() over (Order By (Select NULL))
              ,Type = f.n.value('(.)[1]','varchar(max)') 
         From  @XML2.nodes('root') t(n)
         Cross Apply t.n.nodes('*') f(n)
       ) B
 On A.RN=B.RN
 Order By A.RN

一个选项包含正确的XML

Declare @XML1 xml = '<root><ZID>123</ZID><ZID>456</ZID><ZID>789</ZID></root>'
Declare @XML2 xml = '<root><ZTYPE>A</ZTYPE><ZTYPE>B</ZTYPE><ZTYPE>C</ZTYPE></root>'

Select A.ID
      ,B.Type
 From (
        Select RN=Row_Number() over (Order By (Select NULL))
              ,ID = f.n.value('(.)[1]','int') 
         From  @XML1.nodes('root') t(n)
         Cross Apply t.n.nodes('*') f(n)
      ) A
 Join (
        Select RN=Row_Number() over (Order By (Select NULL))
              ,Type = f.n.value('(.)[1]','varchar(max)') 
         From  @XML2.nodes('root') t(n)
         Cross Apply t.n.nodes('*') f(n)
       ) B
 On A.RN=B.RN
 Order By A.RN

我更改了XML以使其工作

Declare @Hndl1                      int;
Declare @Hndl2                      int;

Declare @Xml_Str1                   Nvarchar(Max) = '<root>'
                                                  + '  <Record>'
                                                  + '    <ZID>123</ZID>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZID>456</ZID>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZID>789</ZID>'
                                                  + '  </Record>'
                                                  + '</root>';

Declare @Xml_Str2                   Nvarchar(Max) = '<root>'
                                                  + '  <Record>'
                                                  + '    <ZTYPE>A</ZTYPE>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZTYPE>B</ZTYPE>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZTYPE>C</ZTYPE>'
                                                  + '  </Record>'
                                                  + '</root>';

Display_Result:
    EXEC sp_xml_preparedocument @Hndl1 OUTPUT, @Xml_Str1;
    EXEC sp_xml_preparedocument @Hndl2 OUTPUT, @Xml_Str2;

    SELECT A.ROW_NBR,
           A.ZID,
           B.ZTYPE
    FROM (SELECT Row_Number() over (Order By (Select NULL)) AS ROW_NBR,
                 ZID
          FROM OPENXML (@Hndl1, '/root/Record',1)
             WITH ( [ZID]         VARCHAR(10) 'ZID') ) A
    INNER JOIN (SELECT Row_Number() over (Order By (Select NULL)) AS ROW_NBR,
                       ZTYPE
                FROM OPENXML (@Hndl2, '/root/Record',1)
                 WITH ( ZTYPE         VARCHAR(10) 'ZTYPE') ) B ON(A.ROW_NBR = B.ROW_NBR);

    EXEC sp_xml_removedocument @Hndl1;
    EXEC sp_xml_removedocument @Hndl2;

我更改了XML以使其工作

Declare @Hndl1                      int;
Declare @Hndl2                      int;

Declare @Xml_Str1                   Nvarchar(Max) = '<root>'
                                                  + '  <Record>'
                                                  + '    <ZID>123</ZID>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZID>456</ZID>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZID>789</ZID>'
                                                  + '  </Record>'
                                                  + '</root>';

Declare @Xml_Str2                   Nvarchar(Max) = '<root>'
                                                  + '  <Record>'
                                                  + '    <ZTYPE>A</ZTYPE>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZTYPE>B</ZTYPE>'
                                                  + '  </Record>'
                                                  + '  <Record>'
                                                  + '    <ZTYPE>C</ZTYPE>'
                                                  + '  </Record>'
                                                  + '</root>';

Display_Result:
    EXEC sp_xml_preparedocument @Hndl1 OUTPUT, @Xml_Str1;
    EXEC sp_xml_preparedocument @Hndl2 OUTPUT, @Xml_Str2;

    SELECT A.ROW_NBR,
           A.ZID,
           B.ZTYPE
    FROM (SELECT Row_Number() over (Order By (Select NULL)) AS ROW_NBR,
                 ZID
          FROM OPENXML (@Hndl1, '/root/Record',1)
             WITH ( [ZID]         VARCHAR(10) 'ZID') ) A
    INNER JOIN (SELECT Row_Number() over (Order By (Select NULL)) AS ROW_NBR,
                       ZTYPE
                FROM OPENXML (@Hndl2, '/root/Record',1)
                 WITH ( ZTYPE         VARCHAR(10) 'ZTYPE') ) B ON(A.ROW_NBR = B.ROW_NBR);

    EXEC sp_xml_removedocument @Hndl1;
    EXEC sp_xml_removedocument @Hndl2;

这甚至不是格式良好的XML,所以我首先要解决这个问题。XML来自哪里?另一个系统。我无法控制我必须从什么开始。那甚至不是格式良好的XML,所以我首先要解决它。XML从哪里来?另一个系统。我无法控制我必须从什么开始。我喜欢这个,它让我得到我想要的。窗口函数调用中Select NULL的顺序是否有任何问题?SQL Server能否保证从XML中提取值的顺序?@SeanWilkinson在读取实际表时有效,但在读取表变量或XML时无效。行号将为true。我使用一个XML解析器,它从来没有失败过保持正确的顺序。我已经将此标记为答案,但我的代表太低,无法显示。我喜欢这个,它让我得到了我想要的。窗口函数调用中Select NULL的顺序是否有任何问题?SQL Server能否保证从XML中提取值的顺序?@SeanWilkinson在读取实际表时有效,但在读取表变量或XML时无效。行号将为true。我使用一个XML解析器,它从来没有失败过保持正确的序列。我已经将此标记为答案,但我的代表太低,无法显示。
ROW_NBR ZID ZTYPE
1       123 A
2       456 B
3       789 C