2012-03-27 3 views
4
<book> 
<author>Bob Villa</author> 
<author>Tom Whatever</author> 
<author>Sarah kajdl</author> 
</book> 

Как я могу запросить любую запись, в которой был автор Tom Whatever? Большинство примеров запросов, которые я видел, ссылаются на значение [x], но я хочу искать всех авторов.Запросить несколько значений XML

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

ответ

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 
+0

Как насчет того, если я хочу запросить весь внешний вид тега 'author' в этом случае? http://stackoverflow.com/questions/26426412/how-to-ensure-the-sql-is-able-to-read-all-xml-tag-data – SearchForKnowledge

3

Если вы просто хотите, значение из переменной XML вы можете использовать метод value непосредственно и использовать sql:variable в этом выражении XPath:

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 
Смежные вопросы