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

Откуда: г. Калуга
Сообщений: 1198
есть в таблице клиентов поле, в котором содержится примерно такой XML
<props>
<prop><name>kpp</name><value>12345</value></prop>
<prop><name>RussiaSubjectCode</name><value>40<value /></prop>
</props>


попробовал прочитать таким запросом
SELECT ClientName,  Cast(props as xml).value('(/props/prop/value)[2]',' varchar(20)')
  FROM Clients


получил значение 40. Все бы хорошо, но надо
1. находить свойство по имени. Ибо этому полю 300 лет, что там в базах у клиентов лежит не известно и в каком порядке свойства записаны тоже не известно
2. возвращать NULL, если свойство не найдено

Это возможно без танцев с бубнами? Или может структуру XML поменять, но на как тогда правильней?
На всякий случай объясню до конца - у админов БД есть возможность самим определять какие свойства "висят" на клиенте.
список свойств хранится в таблице с одним полем и одной строкой в виде:
<props>
<prop><name>kpp</name><title>КПП</title><type>string</type></prop>
<prop><name>RussiaSubjectCode</name><title>Код субъекта РФ</title><type>string</type></prop>
</props>

В итоге конечные юзеры видят русские наименования, заполняю в клиенстком приложении справочник и на сервер строка со значениями уходит уже в представленном выше виде. Все это жило мирно в качестве справочной информации, пока не потребовалось включать эти поля в запросы в отчетах
12 ноя 14, 13:48    [16834253]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
cross apply + .nodes
12 ноя 14, 13:53    [16834289]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Как-то так:

; with c as (
    select 
        ClientName,  props = Cast(props as xml)
    from Clients
)
select
    c.ClientName
    , p.prop.query('.').value('(/name)[1]', 'varchar(100)')
    , p.prop.query('.').value('(/value)[1]', 'varchar(100)')
from        c
cross apply props.nodes('props/prop') p ( prop )
12 ноя 14, 14:01    [16834341]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
invm
Member

Откуда: Москва
Сообщений: 9413
minva
находить свойство по имени
SELECT ClientName,  Cast(props as xml).value('(/props/prop[name = "RussiaSubjectCode"]/value)[1]',' varchar(20)')
  FROM Clients

select
 ClientName,
 p.n.value('value[1]', 'varchar(20)')
from
 Clients c outer apply
 c.props.nodes('props/prop[name = "RussiaSubjectCode"]') p(n)
12 ноя 14, 14:02    [16834353]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
спасибо большое всем!
12 ноя 14, 14:17    [16834448]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
еще вопрос.
Если я сделаю в новой таблице поле типа XML ([props] xml NULL), в которую перегоню данные из существующего поля props, чтоб не делать в будущем приведение типов Cast(props as xml), сервак не будет проверять его содержимое?
вроде попробовал записать туда всякой ерунды, не ругается, но на всякий случай уточнить хочу, в BOL про это как-то не явно сказано.
13 ноя 14, 11:32    [16838846]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
minva
еще вопрос.
Если я сделаю в новой таблице поле типа XML ([props] xml NULL), в которую перегоню данные из существующего поля props, чтоб не делать в будущем приведение типов Cast(props as xml), сервак не будет проверять его содержимое?
вроде попробовал записать туда всякой ерунды, не ругается, но на всякий случай уточнить хочу, в BOL про это как-то не явно сказано.
А зачем валидировать xml при записи? Чтобы дольше писалось?
13 ноя 14, 12:28    [16839417]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
minva
Member

Откуда: г. Калуга
Сообщений: 1198
Гавриленко Сергей Алексеевич,
мне то как раз не надо, но в БОЛ есть такой текст

BOL
В следующих ситуациях следует использовать типизированный тип данных xml :
есть схемы XML-данных и требуется, чтобы сервер проверял соответствие данных этим схемам
....


значит кому-то-зачем-то надо:)
13 ноя 14, 13:26    [16839832]     Ответить | Цитировать Сообщить модератору
 Re: чтение из XML  [new]
Glory
Member

Откуда:
Сообщений: 104760
The xml data type implements the ISO standard xml data type. Therefore, it can store well-formed XML version 1.0 documents and also so-called XML content fragments with text nodes and an arbitrary number of top-level elements in an untyped XML column. The system checks that the data is well-formed, does not require the column to be bound to XML schemas, and rejects data that is not well-formed in the extended sense. This is true also of untyped XML variables and parameters.

declare @t table(f1 xml)
insert @t values('aaa')
select * from @t
insert @t values('<aaa')
13 ноя 14, 13:32    [16839869]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить