日期:2014-05-16  浏览次数:20464 次

xquery按列查询xml
大家好,请问在查询一个上万行的xml表中,表dbo.xmark有两列,其中第一列NAME,类型为nvarchar(20),第二列是value,类型为xml。

是先把每一行的xml文件读出来放在一个临时变量@x中,然后对@x执行query呢,还是对整个value列执行某种操作就能行?

DECLARE @x xml 
DECLARE @y int =0
while @y<1
BEGIN
    select @x =  value from xmark1_0_4 
        where name = 't''+right(cast(1000000+@y as nvarchar),5)+'''
    SELECT @x.query('/site/people/person[@id=''person0'']') 
 
    set @y = @y +1
END
GO





xml文件

<site>
<people>
<person id="person0">
<name>tom</name>
</person>
</people>
</site>



还有就是其实我想查的是id="person0"的那个人的姓名,就是name里面的内容。
想要达到的结果就是在所有的这些xml文件中,如果确有满足这一条件的,打印出结果;如果不满足这个条件,则不显示。但是现在就是结果有很多行,而且内容基本都是空的。。

据我所知,所有这些存储的xml文件中只有1条记录能满足这个条件,也就是说结果只有一条记录。
不知道我问题描述的够不够清楚,还请大神帮忙看看啊
------解决方案--------------------
DROP TABLE #xmark
go

CREATE TABLE #xmark(NAME NVARCHAR(20), [value] XML)
INSERT #xmark ( NAME, value )
SELECT 'test', N'
<site>
<people>
<person id="person0">
<name>tom</name>
</person>
</people>
</site>
' UNION ALL
SELECT 'noboday', N'
<site>
<people>
<person id="person1">
<name>tom</name>
</person>
</people>
</site>
'

--sql:
SELECT name FROM #xmark
WHERE [value].exist('/site/people/person[@id="person0"]') = 1

/*
name
test
*/