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

Откуда:
Сообщений: 38
Всем привет.

Ситуация:
Есть XML c единственным нодом (root) у которого изменяющееся, в зависимости от ситуации, количество аттрибутов.

Вопрос:
Есть какая-нибудь возможность вытащить одним запросом все аттрибуты через OPENXML в формате: <имя аттрибута>, <значение>

Пример:
Данный XML:
<root a="1" b="2" c="3" d="vasya"/>
Требуемый результат:

FieldName Value
a 1
b 2
c 3
d vasya

Заранее благодарен за помощь
29 июн 05, 19:12    [1660826]     Ответить | Цитировать Сообщить модератору
 Re: Все аттрибуты нода через OPENXML  [new]
Alexoid
Member

Откуда:
Сообщений: 38
Народ !!!
Неужели ни у кого нет идеи как это сделать?
29 июн 05, 21:10    [1661025]     Ответить | Цитировать Сообщить модератору
 Re: Все аттрибуты нода через OPENXML  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='<root a="1" b="2" c="3" d="vasya"/>'
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc
SELECT t1.localname as FieldName, t2.text as Value 
FROM OPENXML (@idoc, 'root',1) t1 inner join OPENXML (@idoc, 'root',1) t2 on 
    t1.id = t2.parentid and t1.nodetype = 2

exec sp_xml_removedocument @idoc 
29 июн 05, 21:15    [1661030]     Ответить | Цитировать Сообщить модератору
 Re: Все аттрибуты нода через OPENXML  [new]
Alexoid
Member

Откуда:
Сообщений: 38
Я сделал что-то похожее и когда получил ошибку
Server: Msg 7399, Level 16, State 1, Procedure stp_GetAttributes, Line 18
OLE DB provider 'OpenXML' reported an error. The provider did not give any information about the error.
OLE DB error trace [OLE/DB Provider 'OpenXML' IRowset::RestartPosition returned 0x80004005:  The provider did not give any information about the error.].
почему-то решил, что проблема в повторном использовании в одном запросе OPENXML с ссылкой на один и тот же объект XML.
Как оказалось проблема с сортировкой по имени аттрибута, которую мне необходимо сделать.
Из-за этого-то и возникает ошибка непонятно по какой причине. Может кто сталкивался?
29 июн 05, 22:14    [1661087]     Ответить | Цитировать Сообщить модератору
 Re: Все аттрибуты нода через OPENXML  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Потомучто текст надо кастнуть:
DECLARE @idoc int
DECLARE @doc varchar(1000)
SET @doc ='<root x="xxx" a="1" b="2" c="3" d="vasya"/>'
EXEC sp_xml_preparedocument @idoc OUTPUT, @doc

SELECT cast(t1.localname as varchar(100)) as FieldName, cast(t2.text as varchar(8000)) as Value 
FROM OPENXML (@idoc, 'root',1) t1 inner join OPENXML (@idoc, 'root',1) t2 on 
    t1.id = t2.parentid and t1.nodetype = 2 
order by 1

exec sp_xml_removedocument @idoc 
29 июн 05, 22:26    [1661098]     Ответить | Цитировать Сообщить модератору
 Re: Все аттрибуты нода через OPENXML  [new]
Alexoid
Member

Откуда:
Сообщений: 38
Огромное спасибо, всё получилось.

И ещё один вопрос в догонку.
XML, о котором шла речь, не содержит информации о кодировке и его размеры могут превышать 4000 символов (nvarchar не подойдет), передаётся в ХП, где благополучно падает на SP_XML_PREPAREDOCUMENT ссылаясь на то, что невозможно распарсить XML содержаший инвалидные символы.
Есть какое-нибудь решение этой проблемы?
29 июн 05, 23:38    [1661165]     Ответить | Цитировать Сообщить модератору
 Re: Все аттрибуты нода через OPENXML  [new]
VladRUS.ca
Member

Откуда: Toronto
Сообщений: 1172
Alexoid
...
XML, о котором шла речь, не содержит информации о кодировке и его размеры могут превышать 4000 символов (nvarchar не подойдет), передаётся в ХП...
Входной параметр (XML) процедуры должен быть ntext или text который должен передоваться в неё клиентом ( со стороны SQL Servera это хлопотно )
29 июн 05, 23:54    [1661181]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить