我是XQuery的新手,并且遇到了一些问题。这是我的例子。
我有这个变量:
declare @xmlDoc XML
它中存储了以下xml:
<?xml version="1.0" encoding="utf-8"?>
<NewDataSet>
<xs:schema id="NewDataSet" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:Locale="">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Table1">
<xs:complexType>
<xs:sequence>
<xs:element name="Sharedparam" type="xs:string" minOccurs="0" />
<xs:element name="Antoher" type="xs:string" minOccurs="0" />
<xs:element name="RandomParam2" type="xs:string" minOccurs="0" />
<xs:element name="MoreParam" type="xs:string" minOccurs="0" />
<xs:element name="ResultsParam" type="xs:string" minOccurs="0" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
</xs:element>
</xs:schema>
<Table1>
<Sharedparam>shared</Sharedparam>
<Antoher>sahre</Antoher>
<RandomParam2>Good stuff</RandomParam2>
<MoreParam>and more</MoreParam>
<ResultsParam>2</ResultsParam>
</Table1>
<Table1>
<Sharedparam>Hey</Sharedparam>
<Antoher>what </Antoher>
<RandomParam2>do you</RandomParam2>
<MoreParam>think</MoreParam>
<ResultsParam>2</ResultsParam>
</Table1>
<Table1 />
</NewDataSet>
如何选择Sharedparam的所有值? (或者任何返回值(而不是xml)的体面查询都会很棒。)
我真正想做的是得到这样的结果集:
Name Value1 Value2 Value3 Value4
Sharedparam shared Hey Null Null
Another share what Null Null
....
这会让我忽略“Value4”以外的任何数据(这对我使用这些数据是可以接受的)。
答案 0 :(得分:3)
尝试这样的事情:
SELECT
TBL.SParam.value('(.)[1]', 'varchar(50)')
FROM
@xmldoc.nodes('/NewDataSet/Table1/Sharedparam') AS TBL(SParam)
给我一个输出:
(No column name)
shared
Hey
更新:如果要获取<Table1>
元素中的所有XML元素及其值,可以使用此XQuery:
SELECT
TBL.SParam.value('local-name(.)[1]', 'varchar(50)') 'Attribute',
TBL.SParam.value('(.)[1]', 'varchar(50)') 'Value'
FROM
@xmldoc.nodes('/NewDataSet/Table1/*') AS TBL(SParam)
输出:
Attribute Value
Sharedparam shared
Antoher sahre
RandomParam2 Good stuff
MoreParam and more
ResultsParam 2
Sharedparam Hey
Antoher what
RandomParam2 do you
MoreParam think
ResultsParam 2
更新#2:以获取第一个<Table1>
和第二个<Table1>
XML节点的值,您需要对{{{ 1}} - 一次检索第一个节点,另一次检索第二个节点。它有点毛茸茸,特别是如果你想进一步扩展它 - 性能会很糟糕 - 但是它有效: - )
.nodes()
输出:
SELECT
TBL.SParam.value('local-name(.)[1]', 'varchar(50)') 'Attribute',
TBL.SParam.value('(.)[1]', 'varchar(50)') 'Value 1',
TBL2.SParam2.value('(.)[1]', 'varchar(50)') 'Value 2'
FROM
@xmldoc.nodes('/NewDataSet/Table1[1]/*') AS TBL(SParam)
INNER JOIN
@xmldoc.nodes('/NewDataSet/Table1[2]/*') AS TBL2(SParam2) ON TBL.SParam.value('local-name(.)[1]', 'varchar(50)') = TBL2.SParam2.value('local-name(.)[1]', 'varchar(50)')
答案 1 :(得分:2)
这是一个奇怪的布局。您希望列Sharedparam,Antoher等:不是行。
如果我读得正确,Table1 maxOccurs="unbounded"
表示可变数量的列=不是SQL,它是固定列类型和数字
要将每个标记作为列(固定且有限)读取,您可以这样做:
SELECT
x.item.value('(Sharedparam)[1]', 'varchar(100)') AS Sharedparam,
x.item.value('(Antoher)[1]', 'varchar(100)') AS Antoher,
x.item.value('(SharedRandomParam2param)[1]', 'varchar(100)') AS RandomParam2,
...
FROM
@xmlDoc.nodes('/NewDataSet/Table1') x(item)