Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Простой запрос получения данных из XML  [new]
Andrey_KI
Member

Откуда:
Сообщений: 13
С xml никогда не работал, поэтому вопрос "чайника".
Есть в таблице xml поле Resume. Надо сделать запрос, выводящий значения Prefix, First, Middle, Last, Suffix.
Я так понимаю, надо использовать value(). Только вот с атрибутами запроса затык.
SELECT Resume.value('/ns:Name/ns:Name.Prefix','char(50)') from HumanResources.JobCandidate


Вот кусок XML данных.

К сообщению приложен файл. Размер - 16Kb
30 май 17, 09:09    [20521911]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос получения данных из XML  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
Прочитайте про namespace. Вот пример в тему:

DECLARE @x XML = N'
<ProductInfo xmlns="http://schemas.microsoft.com/2003/10/Serialization/Arrays">
    <Product>
        <ProductID>123</ProductID>
    </Product>
</ProductInfo>'

SELECT t.c.value('.', 'INT')
FROM @x.nodes('ProductInfo/Product/ProductID') t(c)

;WITH XMLNAMESPACES(DEFAULT 'http://schemas.microsoft.com/2003/10/Serialization/Arrays')
SELECT t.c.value('.', 'INT'), t.c.query('.')
FROM @x.nodes('ProductInfo/Product/ProductID') t(c) 

SELECT t.c.value('.', 'INT')
FROM @x.nodes('*:ProductInfo/*:Product/*:ProductID') t(c) 
GO
30 май 17, 10:48    [20522399]     Ответить | Цитировать Сообщить модератору
 Re: Простой запрос получения данных из XML  [new]
Andrey_KI
Member

Откуда:
Сообщений: 13
Вопрос решён.
Сначала надо было зарегистрировать пространство имён по умолчанию.
WITH XMLNAMESPACES (DEFAULT 'http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/Resume')

Ну и потом немного переделать запрос
select 
  Resume.value('(/Resume/Name/Name.Prefix)[1]', 'varchar(100)') AS 'Prefix',
    Resume.value('(/Resume/Name/Name.First)[1]', 'varchar(100)') AS 'First',
  Resume.value('(/Resume/Name/Name.Middle)[1]', 'varchar(100)') AS 'Middle',
  Resume.value('(/Resume/Name/Name.Last)[1]', 'varchar(100)') AS 'Last',
  Resume.value('(/Resume/Name/Name.Suffix)[1]', 'varchar(100)') AS 'Suffix'
from HumanResources.JobCandidate
30 май 17, 11:23    [20522569]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить