Как получить содержимое узла на основе содержимого одного из столбцов XML в базе данных?
<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>
Я хочу получить все названия и только названия книг автора. Информация о книге хранится в столбце БД в виде данных XML. Каждый в отдельном ряду. Я пробовал разные звонки, но это не сработало. Самое близкое, что я получил, было:
select parameters.query('//book[author="a1"]/title/text()') from tablename
Но это возвращает 4 строки с
"t1"
"t2"
""
""
Пожалуйста помоги
2 ответа
Попробуй это
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
*/
Похоже, я неправильно понял функцию value(). Я продолжал помещать [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'
Спасибо RNA Team за предоставленный пример @t, я не знал, что вы можете объявить таблицу как переменную. Сэкономил мне много времени, потому что это позволило мне экспериментировать без реальных данных