2

我知道下面的 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是如何工作的。谢谢

4

2 回答 2

1

基本上,FROM这里的条款:

FROM @WhereClause_XML.nodes('/NewDataSet/param') A(B)

创建 XML 片段的“伪表” - 它枚举所有 XML 节点<NewDataSet>/<param>并创建具有类型A伪列的伪表(称为 )。BXML

这些列将包含<param>- 的值,并且SELECT正在到达这些 XML 节点

SELECT A.B.value('(SearchField)[1]', 'VARCHAR(255)' ) SearchField

在这里,从<param>节点<SearchField>中检索到第一个 XML 元素值,并将其作为名为SearchFieldtype的列返回VARCHAR(255)

从您的代码的外观来看,每个<param>节点可能看起来像:

<param>
    <SearchField>......</SearchField>
    <FilterCondition>....</FilterCondition>
    <ConditionData>....</ConditionData>
    <MatchCase>....</MatchCase>
    <Table>....</Table>
</param>

并且所有这些值都被提取到SELECT语句的列中。

于 2012-01-04T18:05:40.527 回答
1

value()函数从您的XML 中返回一个值,因此使用的 XPath 必须指向一个特定节点。[1]in(SearchField)[1]表示您想要SearchFieldXML 中第一次出现的值。[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
于 2012-01-04T18:14:42.560 回答