根据所需的布局(下面)将以下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);
答案 0 :(得分:7)
您可以使用数字表从子元素中选择第一行,第二行,第三行等。在此查询中,如果提供日期,我将限制返回到该数字的行。如果有比日期更多的值或描述,则必须修改联接以将其考虑在内。
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'))
答案 1 :(得分:2)
使用OPENXML功能。它是一个行集提供程序(它返回从XML解析的行集),因此可以在SELECT或INSERT中使用,如:
INSERT INTO table SELECT * FROM OPENXML(source, rowpattern, flags)
为清晰起见,请参阅文档链接中的第一个示例。
答案 2 :(得分:-1)
通常,如果你想解析XML,你可以使用像Perl,Python,Java或C#这样的编程语言,a)有一个XML DOM,b)可以与关系数据库进行通信。
这是一篇简短的文章,向您展示了在C#中读取和编写XML的一些基础知识......甚至还有一个如何从SQL查询创建XML文档的示例(在一行中!):