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

Откуда:
Сообщений: 131
Set nocount on
DECLARE @outputXML XML,
set @outputXML = (
select * from (
SELECT distinct
1 as Tag,
null as Parent,
[_oid] as [_oid!1!oidid],
null as [_tid!2!tidid],
null as [_action!3!_actionid],
null as [_table!4!_tableid],
null as [_lineNo!5!_lineNoid],
null as [_Elements!6!_columnid!ELEMENT],
null as [_Elements!6!_typeid!ELEMENT],
null as [_Elements!6!_lengthid!ELEMENT],
null as [_Elements!6!_dataid!ELEMENT],
null as [_Elements!6!_data_textid!ELEMENT],
null as [_Elements!6!_data_imageid!ELEMENT]
FROM [dbo].[PIT_Out]
union all
SELECT distinct
2 as Tag,
1 as Parent,
[_oid],
[_tid], null, null, null, null, null, null, null, null, null
FROM [dbo].[PIT_Out]
union all
SELECT distinct
3 as Tag,
2 as Parent,
[_oid],
[_tid],[_action],null, null, null, null, null, null, null, null

FROM [dbo].[PIT_Out]
union all
SELECT distinct
4 as Tag,
3 as Parent,
[_oid],
[_tid],[_action], [_table], null, null, null, null, null, null, null
FROM [dbo].[PIT_Out]
union all
SELECT distinct
5 as Tag,
4 as Parent,
[_oid],
[_tid],
[_action],
[_table],[_lineNo], null, null, null, null, null, null
FROM [dbo].[PIT_Out]
union all
SELECT
6 as Tag,
5 as Parent,
[_oid],
[_tid],
[_action],[_table],
[_lineNo],[_column],[_type],[_length],[_data],[_data_text],[_data_image]
FROM [dbo].[PIT_Out]) t
ORDER BY 3,4,5,6,7,8
FOR XML EXPLICIT, BINARY BASE64)


Как теперь этот xml опять превратить в таблицу?
4 июн 09, 13:26    [7264998]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Как теперь этот xml опять превратить в таблицу?

вам конкретный запрос нужен, или направление просто?

Posted via ActualForum NNTP Server 1.4

4 июн 09, 13:31    [7265032]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
Можно направление.
Я немного запутался и у меня выходит ... бардак
4 июн 09, 14:38    [7265452]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Я немного запутался и у меня выходит ... бардак

а что, собственно, выходит? показывайте.
и еще - очень хотелось бы увидеть скрипт на создание PIT_Out и заполнение
ее тестовыми данными.

Posted via ActualForum NNTP Server 1.4

4 июн 09, 14:44    [7265488]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> и еще - очень хотелось бы увидеть скрипт на создание PIT_Out и заполнение
> ее тестовыми данными.

или получающийся xml хотя бы.
и что хочется получить после обратного превращения в таблицу.

Posted via ActualForum NNTP Server 1.4

4 июн 09, 14:48    [7265506]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
CREATE TABLE [PIT_Out](
[_oid] [uniqueidentifier] NOT NULL,
[_tid] [bigint] NOT NULL,
[_source] [varchar](30) NOT NULL,
[_target] [varchar](30) NOT NULL,
[_table] [varchar](100) NOT NULL,
[_column] [varchar](100) NOT NULL,
[_LineNo] [varchar](100) NOT NULL,
[_type] [varchar](50) NOT NULL,
[_length] [varchar](10) NOT NULL,
[_data] [varchar](max) NULL,
[_data_text] [text] NULL,
[_data_image] [image] NULL,
[_action] [char](1) NOT NULL,
[_no_Load] [bit] NULL
)
4 июн 09, 15:04    [7265613]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
<_oid oidid="9D6C3EB2-F990-4E41-B7CB-535C89DD98AC">
Модератор: Для передачи файлов существует опция "приложить файл"


Сообщение было отредактировано: 4 июн 09, 17:25
4 июн 09, 15:05    [7265622]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
Задача такая сформировать xml
запихнуть в поле
прореплицировать
на др стороне извлеч в данные их xml в таблицу и с ней работать
4 июн 09, 15:09    [7265649]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

а получить что хочется? то же, что изначально было?

Posted via ActualForum NNTP Server 1.4

4 июн 09, 15:10    [7265653]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
Да
4 июн 09, 15:16    [7265696]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

как-то так:
declare @hdoc int
exec sp_xml_preparedocument @hdoc out, @xml

select *
from openxml(@hdoc, '/_oid/_tid/_action/_table/_lineNo/_Elements')
with
   (_oid          uniqueidentifier  '../../../../../@oidid'
    , _tid        bigint            '../../../../@tidid'
    , _action     char(1)           '../../../@_actionid'
    , _table      varchar(100)      '../../@_tableid'
    , _LineNo     varchar(100)      '../@_lineNoid'
    , _column     varchar(100)      '_columnid'
    , _type       varchar(50)       '_typeid'
    , _length     varchar(10)       '_lengthid'
    , _data       varchar(max)      '_dataid'
    , _data_text  text              '_data_textid'
    , _data_image image             '_data_imageid'
   )

exec sp_xml_removedocument @hdoc

Posted via ActualForum NNTP Server 1.4

4 июн 09, 15:39    [7265866]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
Спасибо
4 июн 09, 16:28    [7266185]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
Еще маленький вопрос.
Может неверно image запихиваю в xml
при разборе получаются битые данные
4 июн 09, 16:56    [7266407]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
Как приобразовав в base64
вернуть image к орегинальному виду
4 июн 09, 17:17    [7266566]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Как приобразовав в base64
> вернуть image к орегинальному виду

можно написать clr-функцию для преобразования, как рекомендуется в документации:
http://msdn.microsoft.com/ru-ru/library/ms187897(SQL.90).aspx
смотреть последний пример - "Л. Получение двоичных данных в XML из данных, закодированных методом base64".

или таким трюком воспользоваться:
select <явно перечисляем столбцы>, _data_image.value('.', 'varbinary(max)')
from openxml(@hdoc, '/_oid/_tid/_action/_table/_lineNo/_Elements')
with
    (

     , _data_image xml             '_data_imageid'
    )
не уверен, правда, насколько это быстро будет.

Posted via ActualForum NNTP Server 1.4

5 июн 09, 09:18    [7268264]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
Declare @outputXML xml
set @outputXML = (SELECT [_Fld142RRef], [_Fld143RRef], [_SimpleKey] FROM _InfoReg141 for xml RAW,root, BINARY BASE64)
declare @hdoc int
exec sp_xml_preparedocument @hdoc out, @outputXML

select _Fld142RRef.value('.', 'binary(16)'),_Fld143RRef.value('.', 'binary(16)'),_SimpleKey.value('.', 'binary(16)')
from openxml(@hdoc, '/root/row')
with
(_Fld142RRef xml '@_Fld142RRef'
,_Fld143RRef xml '@_Fld143RRef'
,_SimpleKey xml '@_SimpleKey'
)

exec sp_xml_removedocument @hdoc


Server: Msg 6629, Level 16, State 1, Line 6
The result of the column expression for column "_Fld142RRef" is not compatible with the requested type "XML". The result must be an element, text node, comment node, processing instruction, or document node.
5 июн 09, 09:38    [7268319]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
SELECT t1.root.value('@_Fld142RRef', 'binary(16)') _1,
t1.root.value('@_Fld143RRef', 'binary(16)') _2,
t1.root.value('@_SimpleKey', 'binary(16)') _3
FROM @outputXML.nodes('/root/row') t1(root)


Так работает
5 июн 09, 09:39    [7268320]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> Server: Msg 6629, Level 16, State 1, Line 6
> The result of the column expression for column "_Fld142RRef" is not
> compatible with the requested type "XML". The result must be an element,
> text node, comment node, processing instruction, or document node.

да, забыл кое-что. так должно работать:
      , _data_image xml             '_data_imageid/node()'

но я бы на вашем месте все-таки прочитал пример по ссылке.
там, вроде бы, ничего особо сложного.

Posted via ActualForum NNTP Server 1.4

5 июн 09, 09:58    [7268381]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
По этой ссылке еще вчера все прочел
Все заработало
но действительно не оч быстро.

В чем принциписально отличие этих двух методов

SELECT t1.root.value('@_Fld142RRef', 'binary(16)') _1,
t1.root.value('@_Fld143RRef', 'binary(16)') _2,
t1.root.value('@_SimpleKey', 'binary(16)') _3
FROM @outputXML.nodes('/root/row') t1(root)

select _Fld142RRef.value('.', 'binary(16)'),_Fld143RRef.value('.', 'binary(16)'),_SimpleKey.value('.', 'binary(16)')
from openxml(@hdoc, '/root/row')
with
(_Fld142RRef xml '@_Fld142RRef'
,_Fld143RRef xml '@_Fld143RRef'
,_SimpleKey xml '@_SimpleKey'
)


ПЕрвый на порядок быстрее
5 июн 09, 10:23    [7268469]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381

> В чем принциписально отличие этих двух методов
>
> ПЕрвый на порядок быстрее

у меня на вашем вчерашнем примере гораздо быстрее был как
раз openxml. но: там были все столбцы и не было преобразований
к типу xml и последующих вызовов value. возможно, как раз
вот эти вызовы и съели все преимущества openxml - обычно
считается, что openxml быстрее (ну, по крайней мере, если речь
идет просто о полученном извне xml, а не о индексированных
xml-столбцах) - особенно если много столбцов возвращать надо.

Posted via ActualForum NNTP Server 1.4

5 июн 09, 10:38    [7268532]     Ответить | Цитировать Сообщить модератору
 Re: Как теперь этот xml опять превратить в таблицу?  [new]
god44
Member

Откуда:
Сообщений: 131
На 6 узлах (1441 строка таблицы)
openxml 13 сек
второй 1 сек
5 июн 09, 10:57    [7268644]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить