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

Откуда: Гомель-Минск
Сообщений: 474
Здравствуйте!

Подскажите, пожалуйста, как в MS SQL 2005 сделать следующее:
Есть xml:
DECLARE @xmlStr xml
SET @xmlStr = '<record><Id>1</Id><Name>тест</Name><FullName>тест2</FullName></record>'
нужно преобразовать его в реляционную таблицу вида:
[ColumnName] [Value]
Id 1
Name тест
FullName тест2
Имена элементов в xml (Id, Name, FullName) могут быть другими!
28 авг 09, 14:15    [7590903]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Написал вот такое:
DECLARE @xmlStr xml
DECLARE @idoc int
SET @xmlStr = '<record><Id>1</Id><Name>тест</Name><FullName>тест2</FullName></record>'
EXEC sp_xml_preparedocument @idoc OUTPUT, @xmlStr

SELECT d.localName, ad.text
FROM OPENXML(@idoc,'.') d
  INNER JOIN OPENXML(@idoc,'.') ad ON (ad.ParentId = d.Id)
WHERE d.parentId is not null AND d.nodetype = 1 and ad.nodetype = 3
Господа, может кто подскажет более красивое решение... Общая задача состоит в том, что необходимо передавать в параметре процедуры наборы пара=значение. Сейчас думаю в сторону xml. Передавать в виде строки и парсить не хочется.
28 авг 09, 16:04    [7591731]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Fire83

Господа, может кто подскажет более красивое решение... Общая задача состоит в том, что необходимо передавать в параметре процедуры наборы пара=значение. Сейчас думаю в сторону xml. Передавать в виде строки и парсить не хочется.

А собирать xml и потом его парсить типа хочется ?
28 авг 09, 16:07    [7591760]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Glory,
Других способов передать в процедуру таблицу вида Атрибут-значение я не знаю. Или xml или пары набор-значение с разделителем. Проблема в том, что в данных возможно появление всякого рода запятых, двоеточий и т.д. и тп. т.е. разделитель ещё выбрать надо...
28 авг 09, 16:29    [7591936]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Fire83
Glory,
Других способов передать в процедуру таблицу вида Атрибут-значение я не знаю.


А таблицы уже отменили что ли в MSSQL ?
28 авг 09, 16:36    [7591979]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Fire83
Господа, может кто подскажет более красивое решение...
не знаю, у каждого понятия про красоту разные...
declare @x xml
set @x = '<record><Id>1</Id><Name>тест</Name><FullName>тест2</FullName></record>'

select i.value('local-name(.)', 'varchar(25)') LocalName, i.value('text()[1]', 'varchar(25)') Text
  from @x.nodes('/record/*') as t(i)

LocalName                 Text
------------------------- -------------------------
Id                        1
Name                      тест
FullName                  тест2

(3 row(s) affected)
28 авг 09, 16:39    [7592005]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Glory,
Просто структура не фиксированная..
xml с клиента приходит, в процедуре все должно раскидаться по нужным таблицам.
28 авг 09, 16:41    [7592019]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Паганель,
Во, спасибо. думаю это быстрее будет чем через sp_xml_preparedocument
28 авг 09, 16:44    [7592040]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Fire83
Glory,
Просто структура не фиксированная..
xml с клиента приходит, в процедуре все должно раскидаться по нужным таблицам.

Что ?? Вы хотите передавать набор из двух полей - [ColumnName] [Value] - и называете это нефиксированной структурой ?
28 авг 09, 16:44    [7592044]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Glory,
Я наверное неправильно выразился.
Опишу подробнее зачем надо. В базе есть таблица что-то вроде Attribute (Name, Value). Взаимодействие с базой - только черех хранимки. Добавление одного аттрибута осуществляется через хранимую процедуру( после добавления в эту таблицу в процедуре делаются некоторые дополнительные действия). На клиенте набор вида Пара-Значение, его нужно добавить в базу. Аттрибутов может добавляться, максимум 20-30 штук. Хочется добавлять их все одним вызовом хранимой процедуры.
28 авг 09, 17:07    [7592187]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Glory
Member

Откуда:
Сообщений: 104760
Fire83
Glory,
Я наверное неправильно выразился.
Опишу подробнее зачем надо. В базе есть таблица что-то вроде Attribute (Name, Value). Взаимодействие с базой - только черех хранимки. Добавление одного аттрибута осуществляется через хранимую процедуру( после добавления в эту таблицу в процедуре делаются некоторые дополнительные действия). На клиенте набор вида Пара-Значение, его нужно добавить в базу. Аттрибутов может добавляться, максимум 20-30 штук. Хочется добавлять их все одним вызовом хранимой процедуры.

И что мешает текущему коннект перед вызовом процедуры заполнить таблицу вида (Name, Value) из которой процедура спокойно прочитает нужные данные ?
28 авг 09, 17:16    [7592237]     Ответить | Цитировать Сообщить модератору
 Re: Помогите преобразовать xml  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Glory,
В принципе можно создать временную таблицу, заполнить её, а потом вызвать процедуру, которая пробежит по данным из неё и все сделает. подумаю, может так и сделаю. спасибо.
28 авг 09, 17:26    [7592297]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить