На играющих передних Трех Кольца сделал потрясающее задание с Пираты Загадки . Чистый Java и большие выполнения.
Попробуйте использовать функцию .value
вместо .query
:
SELECT
xmlCol.value('(/container/param[@name="paramB"]/@value)[1]', 'varchar(50)')
FROM
LogTable
Выражение XPath потенциально может вернуть список узлов, поэтому вам потребуется добавить [1]
в этот потенциальный список, чтобы указать SQL Server использовать первую из этих записей (и да - этот список основан на 1, а не на 0). В качестве второго параметра вам нужно указать, в какой тип следует преобразовать значение - здесь просто догадывайтесь.
Marc
В зависимости от фактической структуры вашего xml, может быть полезно поместить на него представление, чтобы упростить использование с использованием «обычного» sql, например
CREATE VIEW vwLogTable
AS
SELECT
c.p.value('@name', 'varchar(10)') name,
c.p.value('@value', 'varchar(10)') value
FROM
LogTable
CROSS APPLY x.nodes('/container/param') c(p)
GO
-- now you can get all values for paramB as...
SELECT value FROM vwLogTable WHERE name = 'paramB'