我开始知道下面的sql可用于从xml中提取数据
--XML DATA SAMPLE
DECLARE @xmlvar xml
SET @xmlvar='
<NewDataSet>
<param>
<SearchField>JID</SearchField>
<FilterCondition>%</FilterCondition>
<ConditionData>4000</ConditionData>
<MatchCase>0</MatchCase>
<Table>MyTableName</Table>
</param>
<param>
<SearchField>Specialist</SearchField>
<FilterCondition>=</FilterCondition>
<ConditionData>Nigel Graham</ConditionData>
<MatchCase>0</MatchCase>
<Table>MyTableName</Table>
</param>
</NewDataSet>'
SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField,
A.B.value('(FilterCondition)[1]', 'VARCHAR(25)' ) Operator,
A.B.value('(ConditionData)[1]', 'VARCHAR(MAX)' ) ConditionData,
A.B.value('(MatchCase)[1]', 'BIT' ) MatchCase,
A.B.value('(Table)[1]', 'VARCHAR(MAX)' ) TableName
FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)
上面的xml正在运行,但我不熟悉上面的sql类型。所以请告诉我 (FilterCondition)[1]或(ConditionData)[1]是什么意思? 为什么不括号[1]为什么不括号[0]或[2]。
请解释我上面的xml如何工作。感谢
答案 0 :(得分:1)
基本上,FROM
条款在这里:
FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)
创建XML片段的“伪表” - 它枚举所有XML节点<NewDataSet>/<param>
并使用类型为{{1的伪列A
创建该伪表(称为B
) }}
这些列将包含XML
的值 - <param>
正在进入这些XML节点
SELECT
此处,从SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField
节点,检索第一个<param>
XML元素值,并将其作为<SearchField>
类型SearchField
的列返回。
从代码的外观来看,每个VARCHAR(255)
节点可能看起来像:
<param>
并将所有这些值提取到<param>
<SearchField>......</SearchField>
<FilterCondition>....</FilterCondition>
<ConditionData>....</ConditionData>
<MatchCase>....</MatchCase>
<Table>....</Table>
</param>
语句的列中。
答案 1 :(得分:1)
value()函数从XML返回一个值,因此使用的XPath必须指向一个特定节点。 [1]
中的(SearchField)[1]
表示您希望XML中第一次出现SearchField
的值。 [2]
当然会给你第二次出现。如果没有[1]
,则会要求所有SearchField
出现。
更新:示例代码:
declare @x xml =
'<root>
<item>1</item>
<item>2</item>
</root>'
select @x.value('(root/item)[1]', 'int') as One,
@x.value('(root/item)[2]', 'int') as Two
结果:
One Two
----------- -----------
1 2