从xml中提取数据

时间:2012-01-04 17:49:32

标签: sql-server sql-server-2005 tsql xquery-sql

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

2 个答案:

答案 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