我有这个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
的部门名称?
答案 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'
这将输出:
由于每个<Article>
节点都有多个部门,因此您需要使用CROSS APPLY
运算符并定义另一个.nodes()
XML子元素列表以获取在所有部门定义。