查询多个XML值

时间:2012-03-27 14:25:24

标签: sql-server xml

<book>
<author>Bob Villa</author>
<author>Tom Whatever</author>
<author>Sarah kajdl</author>
</book>

我如何查询任何有Tom Whatever作者的唱片?我见过的大多数查询示例都引用了值[x],但我想搜索所有作者。

DECLARE @author as varchar(100)
SET @author = 'Tom Whatever'
SELECT xmlfield.value('/book/author')
WHERE xmlfield.value('/book/author') = @author

2 个答案:

答案 0 :(得分:4)

以下是答案

DECLARE @x XML 
SET @x = '<book>
<author>Bob Villa</author>
<author>Tom Whatever</author>
<author>Sarah kajdl</author>
</book>'

DECLARE @author AS VARCHAR(100)
SET @author = 'Tom Whatever'
SELECT c.value('.' ,'VARCHAR(100)')
FROM   @x.nodes('book/author') AS t(c)
WHERE   c.value('.' ,'VARCHAR(8000)') = @author

答案 1 :(得分:3)

如果您只想要XML变量中的值,可以直接使用value方法并在XPath表达式中使用sql:variable

SELECT @XML.value('(/book/author[.=sql:variable("@author")])[1]', 'nvarchar(50)')

如果您在表格中包含XML,并且想要有作者的行,则可以使用exist

select *
from YourTable
where XMLCol.exist('/book/author[.=sql:variable("@author")]') = 1

然后你可以将它们结合起来。

select XMLCol.value('(/book/author[.=sql:variable("@author")])[1]', 'nvarchar(50)')
from YourTable
where XMLCol.exist('/book/author[.=sql:variable("@author")]') = 1