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

Откуда:
Сообщений: 131
Есть
<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw=="/>
<row _idrref="prYAA0dA1DIR2odcZPaxSA=="/>
</root>


Как его преобразовать в 2
т.е.

<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw=="/>
<root>

<root>
<row _idrref="prYAA0dA1DIR2odcZPaxSA=="/>
</root>
22 июл 09, 16:46    [7446652]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

так?
declare @xml xml
set @xml = '<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw=="/>
<row _idrref="prYAA0dA1DIR2odcZPaxSA=="/>
</root>'

select
   t.c.query('<root>{.}</root>')
from @xml.nodes('/root/row') t(c)

Posted via ActualForum NNTP Server 1.4

22 июл 09, 16:49    [7446673]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
Спасибо
22 июл 09, 16:56    [7446714]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
Я вот теперь пытаюсь их объединить
Вроде все работает вот только чуствую неверно делаю , хоят все работает

declare @xml xml

Select @xml =
'<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw=="/>
<row _idrref="prYAA0dA1DIR2odcZPaxSA=="/>
<row _idrref="prYAA0dA1DIR2odbIVUHnw=="/>
</root>'


Set @xml = (select distinct
cast(t.c.query('.') as varchar(max))
from @xml.nodes('/root/row') t(c) for xml path(''), root)
Select @xml = replace(replace(cast(@xml as varchar(max)),'<row','<row'),'/>','/>')

Итог

<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw==" />
<row _idrref="prYAA0dA1DIR2odcZPaxSA==" />
</root>
23 июл 09, 16:14    [7452259]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
Glory
Member

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

Итог

<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw==" />
<row _idrref="prYAA0dA1DIR2odcZPaxSA==" />
</root>

А что должно было получиться ?

Сообщение было отредактировано: 23 июл 09, 16:23
23 июл 09, 16:21    [7452321]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

> Я вот теперь пытаюсь их объединить
> Вроде все работает вот только чуствую неверно делаю , хоят все работает

а в целом-то задача какая?

Posted via ActualForum NNTP Server 1.4

23 июл 09, 16:22    [7452334]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
Glory,

Именно так и должно получиться.
Альтернативный метод боле красивый без replace можект есть?
23 июл 09, 16:44    [7452540]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw,

Есть в xml пакете дубли строк
путаюсь объединить

В приведенном примере сделал но как то не оч красиво с replace
23 июл 09, 16:45    [7452554]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
god44
Я вот теперь пытаюсь их объединить
Вроде все работает вот только чуствую неверно делаю , хоят все работает

declare @xml xml

Select @xml =
'<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw=="/>
<row _idrref="prYAA0dA1DIR2odcZPaxSA=="/>
<row _idrref="prYAA0dA1DIR2odbIVUHnw=="/>
</root>'


Set @xml = (select distinct
cast(t.c.query('.') as varchar(max))
from @xml.nodes('/root/row') t(c) for xml path(''), root)
//Select @xml = replace(replace(cast(@xml as varchar(max)),'<row','<row'),'/>','/>')
Select @xml = replace(replace(cast(@xml as varchar(max)),'<row','<row'),'/>','/>')

Итог

<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw==" />
<row _idrref="prYAA0dA1DIR2odcZPaxSA==" />
</root>
24 июл 09, 08:31    [7454309]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
В реплайсе я заменяю спец символы
Немогу передать их
24 июл 09, 08:32    [7454317]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

> Есть в xml пакете дубли строк
> путаюсь объединить

дубли в _idrref ? или целиком тег?

Posted via ActualForum NNTP Server 1.4

24 июл 09, 08:58    [7454370]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw,
Целиком тег
idrref для примера, полей таблицы может быть много.
24 июл 09, 09:13    [7454408]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

так можно:
select cast(c as xml)
from
   (
    select distinct
      cast(t.c.query('.') as varbinary(max)) c
    from @xml.nodes('/root/row') t(c)
   ) t
for xml path(''), root('root')

Posted via ActualForum NNTP Server 1.4

24 июл 09, 09:38    [7454484]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw

так можно:
select cast(c as xml)
from
   (
    select distinct
      cast(t.c.query('.') as varbinary(max)) c
    from @xml.nodes('/root/row') t(c)
   ) t
for xml path(''), root('root')

Отлично
А если так

Select @xml =
'<root>
<row _idrref="prYAA0dA1DIR2odbIVUHnw==" _SimpleKey="CGeDEBiuGUGf2wEQhGvQSg=="/>
<row _idrref="prYAA0dA1DIR2odcZPaxSA==" _SimpleKey="hh3zWeOOQEWjmuyYno0OCg=="/>
<row _idrref="prYAA0dA1DIR2odbIVUHnw==" _SimpleKey="i//yYtvOC0i5feVOP8IU6w=="/>
</root>'

В таком режиме я не могу удалить уникальнось

Можно реплейсом
replace value of
Expression1
with
Expression2

Сначала обнулить SimpleKey
А вторым проставить ему новое значение cast(newid() as binary(16))?
Для преобразования binary(16) в base64 писать clr функцию?
24 июл 09, 09:56    [7454576]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

> Отлично
> А если так

а так что получить надо?

Posted via ActualForum NNTP Server 1.4

24 июл 09, 10:22    [7454700]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

так. еще раз. удаляем элементы с дублирующимся значением _idrref
(который из них оставлять - все равно?), или целиком одинаковые элементы?

Posted via ActualForum NNTP Server 1.4

24 июл 09, 10:25    [7454720]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw,

Да все равно

Они продублированы, а последее поле бесполезное и им можно жертвовать
24 июл 09, 10:55    [7454920]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

а на основной вопрос? дубли по _idrref ищем?

Posted via ActualForum NNTP Server 1.4

24 июл 09, 11:03    [7454987]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw,

ну да

делаем замену неважного реквизита на _SimpleKey="A"

удаляем дубли уже по всем реквизитам

заполняем _SimpleKey = cast(newid() as binari(16)) как то запихав его в base64
24 июл 09, 11:09    [7455070]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

> удаляем дубли уже по всем реквизитам

а так не устроит?
;with cte as
(select
    row_number() over (partition by cast(t.c.query('<row>{@*[local-name()!="_SimpleKey"]}</row>') as varbinary(max)) 
order by t.c) rn
    , t.c.query('.') r
  from @xml.nodes('/root/row') t(c)
)
select @xml = (
                select r as [node()] from cte
                where rn = 1
                for xml path(''), root
               )
select @xml

Posted via ActualForum NNTP Server 1.4

24 июл 09, 11:23    [7455197]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw,

Да только _SimpleKey нужно новое значение = cast(newid() as binari(16)) как то запихав его в base64
24 июл 09, 11:51    [7455467]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

> Да только _SimpleKey нужно новое значение = cast(newid() as binari(16)) как то запихав его в base6

если обязательно новое - так можно:
select t2.a.query('<row>{/row/@*, attribute _SimpleKey {sql:column("c2")}}</row>')
from
   (
    select cast(t1.a as xml) a, cast(newid() as varbinary(16)) c2
    from
      (
       select distinct
         cast(t.c.query('<row>{@*[local-name()!="_SimpleKey"]}</row>') as varbinary(max)) a
       from @xml.nodes('/root/row') t(c)
      ) t1
    ) t2
for xml path(''), root('root')


Posted via ActualForum NNTP Server 1.4

24 июл 09, 12:53    [7455979]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw,

Подскажи что почитать по xml
msdn не предлагать))
28 июл 09, 16:26    [7469986]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
daw
Member

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

> Подскажи что почитать по xml
> msdn не предлагать))

отдельными ссылками только могу поделиться.

базовые вещи здесь: http://www.w3schools.com/
по xquery на citforum неплохая статья есть: http://www.citforum.ru/internet/articles/xqlzxml.shtml

примеры по for xml http://beyondrelational.com/blogs/jacob/archive/2009/06/12/for-xml-tutorials.aspx
по xquery http://beyondrelational.com/blogs/jacob/archive/tags/XQuery-Labs/default.aspx

ну, и никто не отменял спецификации c //www.w3.org
там, кстати, и такой вот интересный документ есть: http://www.w3.org/TR/xquery-use-cases/

Posted via ActualForum NNTP Server 1.4

28 июл 09, 16:54    [7470243]     Ответить | Цитировать Сообщить модератору
 Re: Разложить xml на несколько  [new]
god44
Member

Откуда:
Сообщений: 131
daw,

Интресный док наполивину в sql неработает
Или что то делаю не так?

Declare @xml xml
set @xml = '<report>
<section>
<section.title>Procedure</section.title>
<section.content>
The patient was taken to the operating room where she was placed
in supine position and
<anesthesia>induced under general anesthesia.</anesthesia>
<prep>
<action>A Foley catheter was placed to decompress the bladder</action>
and the abdomen was then prepped and draped in sterile fashion.
</prep>
<incision>
A curvilinear incision was made
<geography>in the midline immediately infraumbilical</geography>
and the subcutaneous tissue was divided
<instrument>using electrocautery.</instrument>
</incision>
The fascia was identified and
<action>#2 0 Maxon stay sutures were placed on each side of the midline.
</action>
<incision>
The fascia was divided using
<instrument>electrocautery</instrument>
and the peritoneum was entered.
</incision>
<observation>The small bowel was identified.</observation>
and
<action>
the
<instrument>Hasson trocar</instrument>
was placed under direct visualization.
</action>
<action>
The
<instrument>trocar</instrument>
was secured to the fascia using the stay sutures.
</action>
</section.content>
</section>
</report>
'
Select @xml.query('declare function local:precedes($a as node(), $b as node()) as xs:boolean
{
$a << $b
and
empty($a//node() intersect $b)
};


declare function local:follows($a as node(), $b as node()) as xs:boolean
{
$a >> $b
and
empty($b//node() intersect $a)
};

<critical_sequence>
{
let $proc := doc("report1.xml")//section[section.title="Procedure"][1]
for $n in $proc//node()
where local:follows($n, ($proc//incision)[1])
and local:precedes($n, ($proc//incision)[2])
return $n
}
</critical_sequence> ')
30 июл 09, 11:30    [7477790]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить