Sql server 在SQL Server中交织XML段
我得到了两个始终成对的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> 关于如何实现这一点的想法?
<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