Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / XML как вытащить ветку / 8 сообщений из 8, страница 1 из 1
05.09.2006, 22:26
    #33966614
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
Adaptive Server Anywhere Network Server Version 9.0.2.3354

доброго времени суток!
вот проблема на меня свалилась, и ни как не могу найти правельное направление решения:
нужно из поля содержащего XML выдернуть одну ветку и положить в поле другой таблицы, название ветки - заранее известно.

читал вроде инструкцию, но . . . обращаюсь сюда (стал непроходимо туп к окончанию вторых суток)

С уважением
Александр Плотников.
...
Рейтинг: 0 / 0
05.09.2006, 23:13
    #33966652
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
Ветку выдернуть нельзя.
Из XML можно вытащить только табличку. В смысле ветка всегда превращается в виртуальную таблицу. Впрочем, потом ее можно снова представить в виде нового xml :)
А вообще все очень просто. Смотри функцию OpenXML.
А чтобы в качестве хранилища xml-ов использовать поле другой таблицы, надо использовать LATERAL. Примерно так:
Если в ReportsActivity.RepData лежит xml вида:
Код: plaintext
1.
2.
3.
4.
<Report>
<row RowId="aaa" SomeValue="12456" OtherValue="754" Total="458340"/>
<row RowId="bbb" OtherValue="345" Total="458340"/>
<row RowId="aaa" Total="12456"/>
</Report>
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
select b.RowId, sum(b.Units)
	from ReportsActivity a,
	lateral(select Units from OpenXML(a.RepData, '/Report/row')
					with (RowId char( 3 ) '@RowId', Units double '@Total')
					where Units is not null
		) as b
	where a.ReportCode = @ReportCode and a.StartDate = @StartDate
	group by b.RowId;

---
http://www.rusug.ru] Портал рускоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
07.09.2006, 05:22
    #33969590
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
спасибо, а то время тратил на поиск несуществующего, вот сам наваял:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
CREATE FUNCTION "ASAadministrator"."XML_path"(
IN @xmlconten long varchar,   //сам о тело XML
IN @XMLpath varchar ( 254 )    //каталог, содержимое которого нужно получить
)
RETURNS long varchar
NOT DETERMINISTIC
BEGIN
DECLARE @@xmlGetPath long varchar;

DECLARE bi1 bigint;
DECLARE @KeyContextStart varchar ( 20 );
DECLARE @KeyContextEnd varchar ( 20 );
DECLARE @ContextStart integer;
DECLARE @ContextEnd integer;
DECLARE @ContextLength integer;
DECLARE @CutContext long varchar;

set @KeyContextStart = '<' || @XMLpath || '>';
set @KeyContextEnd = INSERTSTR ( 1 ,@KeyContextStart,'/');

set @ContextStart = LOCATE (@xmlconten,@KeyContextStart);
set @ContextEnd = LOCATE (@xmlconten,@KeyContextEnd) + LENGTH(@KeyContextEnd);
set @ContextLength = @ContextEnd - @ContextStart;
set @@xmlGetPath = SUBSTRING ( @xmlconten, @ContextStart, @ContextLength );

RETURN @@xmlGetPath;
END
...
Рейтинг: 0 / 0
07.09.2006, 05:28
    #33969592
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
а вот сразу и исправления, хм что бы увидеть нужно было опубликовыть
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ALTER FUNCTION "ASAadministrator"."XML_path"(
IN @xmlconten long varchar,
IN @XMLpath varchar ( 254 )
)
RETURNS long varchar
NOT DETERMINISTIC
BEGIN
DECLARE @@xmlGetPath long varchar;

DECLARE @KeyContextStart varchar ( 100 );
DECLARE @KeyContextEnd varchar ( 101 );
DECLARE @ContextStart integer;
DECLARE @ContextEnd integer;
DECLARE @ContextLength integer;

set @KeyContextStart = '<' || @XMLpath || '>';
set @KeyContextEnd = INSERTSTR ( 1 ,@KeyContextStart,'/');

set @ContextStart = LOCATE (@xmlconten,@KeyContextStart);
set @ContextEnd = LOCATE (@xmlconten,@KeyContextEnd) + LENGTH(@KeyContextEnd);
set @ContextLength = @ContextEnd - @ContextStart;
set @@xmlGetPath = SUBSTRING ( @xmlconten, @ContextStart, @ContextLength );

RETURN @@xmlGetPath;
END
...
Рейтинг: 0 / 0
07.09.2006, 08:11
    #33969665
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
и совсем правильно:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ALTER FUNCTION "DBA"."XML_path"(
IN @xmlconten long varchar,
IN @XMLpath varchar ( 254 )
)
RETURNS long varchar
NOT DETERMINISTIC
BEGIN
DECLARE @xmlGetPath long varchar;

DECLARE @KeyContextStart varchar ( 20 );
DECLARE @KeyContextEnd varchar ( 20 );
DECLARE @ContextStart integer;
DECLARE @ContextEnd integer;
DECLARE @ContextLength integer;

set @KeyContextStart = '<' || @XMLpath || '>';
set @KeyContextEnd = INSERTSTR ( 1 ,@KeyContextStart,'/');

set @ContextStart = LOCATE (@xmlconten,@KeyContextStart);
set @ContextEnd = LOCATE (@xmlconten,@KeyContextEnd,- 1 ) + LENGTH(@KeyContextEnd);
set @ContextLength = @ContextEnd - @ContextStart;
set @@xmlGetPath = SUBSTRING ( @xmlconten, @ContextStart, @ContextLength );

RETURN @xmlGetPath;
END
...
Рейтинг: 0 / 0
07.09.2006, 08:16
    #33969670
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
и финальная версия (может быть название дать более правильное и можно в фаг кинуть для пользования начинающими):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
CREATE FUNCTION "DBA"."XML_path"(
IN @xmlconten long varchar,
IN @XMLpath varchar ( 254 )
)
RETURNS long varchar
NOT DETERMINISTIC
BEGIN
DECLARE @xmlGetPath long varchar;

DECLARE @KeyContextStart varchar ( 100 );
DECLARE @KeyContextEnd varchar ( 101 );
DECLARE @ContextStart integer;
DECLARE @ContextEnd integer;
DECLARE @ContextLength integer;

set @KeyContextStart = '<' || @XMLpath || '>';
set @KeyContextEnd = INSERTSTR ( 1 ,@KeyContextStart,'/');

set @ContextStart = LOCATE (@xmlconten,@KeyContextStart);
set @ContextEnd = LOCATE (@xmlconten,@KeyContextEnd,- 1 ) + LENGTH(@KeyContextEnd);
set @ContextLength = @ContextEnd - @ContextStart;
set @@xmlGetPath = SUBSTRING ( @xmlconten, @ContextStart, @ContextLength );

RETURN @xmlGetPath;
END

С уважением
Александр Плотников.
...
Рейтинг: 0 / 0
30.11.2006, 20:45
    #34168825
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
Здрасте!
вот со временем возник ответ:

SELECT * FROM openxml( '', '/SafeCad/CutContext/Core/Contour' )
WITH ( "GUID" VARCHAR (40) '@GUID',ProductName LONG VARCHAR ' @mp:xmltext ')

и ведь работает!
С уважением
Александр Плотников.
...
Рейтинг: 0 / 0
30.11.2006, 20:50
    #34168833
panu
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
XML как вытащить ветку
ой ой, опять тороплюсь и наверное многих рассмешил.
вот правильно:

SELECT * FROM openxml( 'XML контен', 'путь до интересующей ветки' )
WITH ( "какое то поле" VARCHAR (40) '@GUID',"название поля содержащее тело ветки" LONG VARCHAR '@mp:xmltext ')

С уважением
Александр Плотников.
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / XML как вытащить ветку / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]