从sql server中的复杂xml中选择数据

时间:2014-08-15 06:42:13

标签: sql-server xml tsql

我有这个XML:

<Articles> 
    <Article> 
        <ArticleNo>31213496</Article_No> 
        <ArticleDes>PRESSNING</ArticleDes> 
        <Notes></Notes> 
        <EstimatedCycleTime>2.05714285714286</EstimatedCycleTime> 
        <Departments> 
            <Department isLinked="true" name="Finnveden Olofström" /> 
            <Department isLinked="false" name="3333333333" /> 
            <Department isLinked="true" name="company_hide" /> 
          <Department isLinked="false" name="Department1" /> 
      </Departments> 
    </Article> 
</Articles>

我使用此SQL来选择文章数据:

declare  
        @articleNo nvarchar(25), 
        @articleDes nvarchar(255), 
        @notes nvarchar(max), 
        @cycleTime float  
declare cls cursor scroll for 
        select a.value('Article_No[1]','nvarchar(25)'), a.value('ArticleDes[1]','nvarchar(255)'),a.value('Notes[1]','nvarchar(max)'),a.value('EstimatedCycleTime[1]','float') 
        from @xml.nodes('Articles/Article') as a(a) 
open cls 
fetch next from cls into @articleNo, @articleDes, @notes, @cycleTime 
while @@FETCH_STATUS = 0 
begin 
        select @articleNo, @articleDes, @notes, @cycleTime 
        fetch next from cls into @articleNo, @articleDes, @notes, @cycleTime 
end 
close cls 
deallocate cls 

如何为每个isLinked="true"选择Article的部门名称?

1 个答案:

答案 0 :(得分:3)

绝对无需这里有一个凌乱的光标!只需在SQL Server中使用本机XQuery支持:

SELECT
    a.value('Article_No[1]','nvarchar(25)'), 
    a.value('ArticleDes[1]','nvarchar(255)'),
    a.value('Notes[1]','nvarchar(max)'),
    a.value('EstimatedCycleTime[1]', 'decimal(28,14)') ,
    DepartmentName = d.value('@name', 'nvarchar(50)')
FROM
    @xml.nodes('Articles/Article') as a(a) 
CROSS APPLY
    a.nodes('Departments/Department') AS d(d)
WHERE
    d.value('@isLinked', 'varchar(10)') = 'true'

这将输出:

enter image description here

由于每个<Article>节点都有多个部门,因此您需要使用CROSS APPLY运算符并定义另一个.nodes() XML子元素列表以获取在所有部门定义。