powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как исключить узел без атрибутов из openxml
4 сообщений из 4, страница 1 из 1
как исключить узел без атрибутов из openxml
    #40037977
elltek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В документе присутствует лишний узел <RESULT/> . Он без атрибутов. Конструкция [text()] совсем ничего не возвращает:
Код: sql
1.
from openxml(@ixml, '/RTS_DOC/SPB21/BOARD/SECURITY/RESULT[text()]', 2)


XML:
Код: xml
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="http://ftp.nprts.ru/mse/schema/SPB21.xslt"?><?xml-stylesheet type="text/xsl" href="C:\RTS\XSLT\SPB21.xslt"?>
<RTS_DOC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ftp.nprts.ru/mse/schema/SPB21.xsd">
    <DOC_REQUISITES DOC_DATE="2021-01-22" />
    <SPB21 TradeDate="2021-01-21" >
        <BOARD BoardId="EBOND" >
            <SECURITY SecurityId="SLB" >
                <RESULT TotalAmount="67368.00" TotalVolume="1653456.57" />
            </SECURITY>
            <SECURITY SecurityId="SLG" >
                <RESULT/>
                <RESULT TotalAmount="0.00" TotalVolume="0.00" >
            </SECURITY>
        </BOARD>
    </SPB21>
</RTS_DOC>


T-SQL:
Код: sql
1.
2.
3.
4.
5.
6.
select *
	from openxml(@ixml, '/RTS_DOC/SPB21/BOARD/SECURITY/RESULT', 2) with(
	   tot_amount    decimal(20, 0) '@TotalAmount',
	   tot_volume    decimal(20, 2) '@TotalVolume'
	)
where tot_amount is not null and tot_volume is not null


Есть другой способ кроме как проверять каждое значение на null?
...
Рейтинг: 0 / 0
как исключить узел без атрибутов из openxml
    #40037988
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
1.
from openxml(@h, '/RTS_DOC/SPB21/BOARD/SECURITY/RESULT[@*]', 2)


- будет обрабатывать узлы, у которых есть хотя бы 1 любой атрибут. Или можно перечислить нужные атрибуты внутри [].
Но это актуально для XQuery, openxml в данном случае сам отбрасывает такие узлы, т.к. там нет атрибутов, указанных в with (достаточно отсутствия хотя бы одного атрибута, указанного в with, чтобы данные узла не попали в выборку).
...
Рейтинг: 0 / 0
как исключить узел без атрибутов из openxml
    #40037990
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
elltek,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare @x xml = '<RTS_DOC xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ftp.nprts.ru/mse/schema/SPB21.xsd">
    <DOC_REQUISITES DOC_DATE="2021-01-22" />
    <SPB21 TradeDate="2021-01-21">
        <BOARD BoardId="EBOND">
            <SECURITY SecurityId="SLB">
                <RESULT TotalAmount="67368.00" TotalVolume="1653456.57"/>
            </SECURITY>
            <SECURITY SecurityId="SLG">
                <RESULT/>
                <RESULT TotalAmount="0.00" TotalVolume="0.00"/>
            </SECURITY>
        </BOARD>
    </SPB21>
</RTS_DOC>'

select T.c.value('(./@TotalAmount)[1]', 'float') as [amount],
       T.c.value('(./@TotalVolume)[1]', 'float') as [volume]
from @x.nodes('/RTS_DOC/SPB21/BOARD//SECURITY//RESULT[not(fn:empty(@TotalAmount))]') T(c)
...
Рейтинг: 0 / 0
как исключить узел без атрибутов из openxml
    #40038023
elltek
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сон Веры Павловны
будет обрабатывать узлы, у которых есть хотя бы 1 любой атрибут. Или можно перечислить нужные атрибуты внутри [].
Но это актуально для XQuery, openxml в данном случае сам отбрасывает такие узлы, т.к. там нет атрибутов, указанных в with (достаточно отсутствия хотя бы одного атрибута, указанного в with, чтобы данные узла не попали в выборку).

Спасибо. Работает.
Но сам не отбрасывал. Возможно потому, что на самом деле реальный with содержит не только атрибуты этого узла, но и атрибуты родительских.

felix_ff
RESULT[not(fn:empty(@TotalAmount))]
ничем не лучше, по объему кода, чем where tot_amount is not null. Но, все равно, спасибо.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / как исключить узел без атрибутов из openxml
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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