2015-10-23 4 views
0
<book> 
<author>a1</author> 
<title>t1</title> 
</book> 
<book> 
<author>a1</author> 
<title>t2</title> 
</book> 
<book> 
<author>a2</author> 
<title>t3</title> 
</book> 
<book> 
<author>a3</author> 
<title>t4</title> 
</book> 

Я хочу получить все названия и только названия книг автора. Информация о книге хранится в столбце db как данные xml. Каждый из них находится в другом ряду. Я пробовал различные вызовы стоимости, и он вообще не работал. Ближайший я получил:Как получить содержимое узла на основе содержимого дочернего узла из столбца xml в базе данных?

select parameters.query('//book[author="a1"]/title/text()') from tablename 

Но это возвращает 4 строки с

"t1" 
"t2" 
"" 
"" 

Пожалуйста, помогите

ответ

1

Попробуйте

DECLARE @t TABLE (
    Data XML 
) 
INSERT INTO @t (Data) 
SELECT '<book> 
<author>a1</author> 
<title>t1</title> 
</book> 
<book> 
<author>a1</author> 
<title>t2</title> 
</book> 
<book> 
<author>a2</author> 
<title>t3</title> 
</book> 
<book> 
<author>a3</author> 
<title>t4</title> 
</book>' 

SELECT 
    x.value('author[1]', 'VARCHAR(20)') AS Author 
    ,x.value('title[1]', 'VARCHAR(20)') AS Title 
FROM @t t 
CROSS APPLY Data.nodes('/book') a(x) 
WHERE x.value('author[1]', 'VARCHAR(20)') = 'a1' 

/* 
Author Title 
------ ------- 
a1   t1 
a1   t2 
*/ 
1

Похоже, я неправильно понял значение функции() , Я продолжал класть [1] за рамки одиночных кавычек, и он продолжал терпеть неудачу. Далее производит то, что я искал:

DECLARE @t TABLE (
Book XML 
) 
INSERT INTO @t (Book) values ('<book><author>a1</author><title>t1</title></book>') 
INSERT INTO @t (Book) values ('<book><author>a1</author><title>t2</title></book>') 
INSERT INTO @t (Book) values ('<book><author>a2</author><title>t3</title></book>') 
INSERT INTO @t (Book) values ('<book><author>a3</author><title>t4</title></book>') 
select Book.value('(/book/title)[1]', 'VARCHAR(20)') as title from @t t 
where Book.value('(/book/author)[1]', 'VARCHAR(20)') = 'a1' 

Благодаря РНК команды, для придания @t примеру, я не знал, что вы могли бы объявить таблицу в качестве переменной. Сэкономил много времени, потому что это позволило мне экспериментировать без реальных данных.

Смежные вопросы