将嵌套XML解析为SQL表
发布时间:2020-12-16 23:17:09 所属栏目:百科 来源:网络整理
导读:根据所需的布局(下面)将以下 XML块解析为SQL Server表的正确方法是什么?是否可以使用单个SELECT语句,没有UNION或循环?任何接受者?提前致谢. 输入XML: ObjectData Parameter1some value/Parameter1 Parameter2other value/Parameter2 Dates dateTime2011-
根据所需的布局(下面)将以下
XML块解析为SQL Server表的正确方法是什么?是否可以使用单个SELECT语句,没有UNION或循环?任何接受者?提前致谢.
输入XML: <ObjectData> <Parameter1>some value</Parameter1> <Parameter2>other value</Parameter2> <Dates> <dateTime>2011-02-01T00:00:00</dateTime> <dateTime>2011-03-01T00:00:00</dateTime> <dateTime>2011-04-01T00:00:00</dateTime> </Dates> <Values> <double>0.019974</double> <double>0.005395</double> <double>0.004854</double> </Values> <Description> <string>this is row 1</string> <string>this is row 2</string> <string>this is row 3</string> </Values> </ObjectData> 所需的表输出: Parameter1 Parameter2 Dates Values Description Some value Other value 2011-02-01 00:00:00.0 0.019974 this is row 1 Some value Other value 2011-03-01 00:00:00.0 0.005395 this is row 2 Some value Other value 2011-04-01 00:00:00.0 0.004854 this is row 3 我在使用OPENXML或xml.nodes()功能的SELECT SQL语句之后.例如,以下SELECT语句导致值和日期之间的生成(即值和日期的所有排列),这是我想要避免的. SELECT doc.col.value('Parameter1[1]','varchar(20)') Parameter1,doc.col.value('Parameter2[1]','varchar(20)') Parameter2,doc1.col.value('.','datetime') Dates,doc2.col.value('.','float') [Values] FROM @xml.nodes('/ObjectData') doc(col),@xml.nodes('/ObjectData/Dates/dateTime') doc1(col),@xml.nodes('/ObjectData/Values/double') doc2(col); 解决方法
您可以使用数字表从子元素中选择第一行,第二行,第三行等.在此查询中,如果提供日期,我将限制返回到该数字的行.如果有比日期更多的值或描述,则必须修改联接以将其考虑在内.
declare @XML xml = ' <ObjectData> <Parameter1>some value</Parameter1> <Parameter2>other value</Parameter2> <Dates> <dateTime>2011-02-01T00:00:00</dateTime> <dateTime>2011-03-01T00:00:00</dateTime> <dateTime>2011-04-01T00:00:00</dateTime> </Dates> <Values> <double>0.019974</double> <double>0.005395</double> <double>0.004854</double> </Values> <Description> <string>this is row 1</string> <string>this is row 2</string> <string>this is row 3</string> </Description> </ObjectData>' ;with Numbers as ( select number from master..spt_values where type = 'P' ) select T.N.value('Parameter1[1]','varchar(50)') as Parameter1,T.N.value('Parameter2[1]','varchar(50)') as Parameter2,T.N.value('(Dates/dateTime[position()=sql:column("N.Number")])[1]','datetime') as Dates,T.N.value('(Values/double[position()=sql:column("N.Number")])[1]','float') as [Values],T.N.value('(Description/string[position()=sql:column("N.Number")])[1]','varchar(max)') as [Description] from @XML.nodes('/ObjectData') as T(N) cross join Numbers as N where N.number between 1 and (T.N.value('count(Dates/dateTime)','int')) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |