powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Xml перебрать значения в цикле
18 сообщений из 18, страница 1 из 1
Xml перебрать значения в цикле
    #39719141
Be_rude
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет, каким образом нужно указывать порядковый номер нужного элемента в цикле?
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
Set @xml=‘
<Root>
<row>1</row>
<row>2</row>
<row>3</row>
</root/>’

Set @i=0
Set @value=@xml.value(‘/root/row/@value[1]’, ‘varchar(10)’) — так указываем первый элемент
While @value is not null
Begin
Set @i=@i+1

Set @value=@xml.value(‘/root/row/@value[как здесь указать переменную @i]’, ‘varchar(10)’)
Loop
End
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #39719148
felix_ff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Be_rude,

вы придумываете какой то свой синтаксис. может лучше огласите первичную задачу которую пытаетесь решить?
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #39719181
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
felix_ffBe_rude,

вы придумываете какой то свой синтаксисВот вот, ТС хотя бы работающий пример выложил (XML у него невалидный, получение первого элемента некорректное)

Если решать не задачу получения произвольного элемента XML в динамике по порядковому номеру, а задачу из заголовка "Xml перебрать значения в цикле", то её можно решать получением всех элементов в временную таблицу, и перебиранием их с помощью курсора
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #39719199
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgXML у него невалидный
не well-formed
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #39719747
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныalexeyvgXML у него невалидный
не well-formedНе знаю, что такое well-formed, но вот это: </root/> выглядит странно, как и незакрытая нода root
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #39719809
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvgНе знаю, что такое well-formed, но вот это: </root/> выглядит странно, как и незакрытая нода root
Well-formed - просто правильно сформированный. Валидный - правильно сформированный и прошедший проверку правил (схема, DTD).
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Xml перебрать значения в цикле
    #40035116
alexeyvg

Если решать не задачу получения произвольного элемента XML в динамике по порядковому номеру, а задачу из заголовка "Xml перебрать значения в цикле", то её можно решать получением всех элементов в временную таблицу, и перебиранием их с помощью курсора

Здравствуйте! А можно пример?
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035131
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун
alexeyvg

Если решать не задачу получения произвольного элемента XML в динамике по порядковому номеру, а задачу из заголовка "Xml перебрать значения в цикле", то её можно решать получением всех элементов в временную таблицу, и перебиранием их с помощью курсора

Здравствуйте! А можно пример?
а зачем это нужно ?

а так-то, можно как-то так
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
declare @xml xml =
'<root>
<row>1</row>
<row>2</row>
<row>3</row>
</root>'


;with cte as (
	select 
		lvl	=1
		,val	=t.c.value('text()[1]', 'int') 
		,xml	=@xml 
	from @xml.nodes('/root/row[1]') as t(c)

	union all

	select
		cte.lvl + 1
		,t.c.value('text()[1]', 'int')
		,cte.xml
	from cte cross apply cte.xml.nodes('/root/row[sql:column("lvl")+1]') as t(c)
)
select lvl, val from cte


lvlval112233
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035134
court, спасибо. Мне нужно подсчитать сколько полей всего и сколько из них заполнено. Единственно у меня xml не такой однобокий как в примере ТС. Ключевой элемент называется item, а в нем куча вложенных полей с разными названиями, вот пример xml:
автор<item>
<F_Partner_Types title="Тип потребителя" type="value">1</F_Partner_Types>
<C_Subscr_Code title="Лицевой счет" type="value">602060007031</C_Subscr_Code>
<N_Own_Subscr_Not_Fill title="Отказ от заполнения" type="value"/>
...
<N_Longitude title="Долгота" type="value">45.05138072</N_Longitude>
</item>

При этом поле оформленное как N_Own_Subscr_Not_Fill нужно считать незаполненным
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035139
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Борис Гаркун
Мне нужно подсчитать сколько полей всего и сколько из них заполнено
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @xml xml = '<item>
<F_Partner_Types title="Тип потребителя" type="value">1</F_Partner_Types>
<C_Subscr_Code title="Лицевой счет" type="value">602060007031</C_Subscr_Code>
<N_Own_Subscr_Not_Fill title="Отказ от заполнения" type="value"/>
<N_Longitude title="Долгота" type="value">45.05138072</N_Longitude>
</item>';

select
 count(*) as Всего, 
 sum(case when a.n.value('@title', 'varchar(30)') <> 'Отказ от заполнения' then 1 else 0 end) Заполнено
from
 @xml.nodes('/item/*') a(n);
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035141
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
Борис Гаркун
Мне нужно подсчитать сколько полей всего и сколько из них заполнено
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
declare @xml xml = '<item>
<F_Partner_Types title="Тип потребителя" type="value">1</F_Partner_Types>
<C_Subscr_Code title="Лицевой счет" type="value">602060007031</C_Subscr_Code>
<N_Own_Subscr_Not_Fill title="Отказ от заполнения" type="value"/>
<N_Longitude title="Долгота" type="value">45.05138072</N_Longitude>
</item>';

select
 count(*) as Всего, 
 sum(case when a.n.value('@title', 'varchar(30)') <> 'Отказ от заполнения' then 1 else 0 end) Заполнено
from
 @xml.nodes('/item/*') a(n);

имхо, ТС под этим
Борис Гаркун
При этом поле оформленное как N_Own_Subscr_Not_Fill нужно считать незаполненным
имеет ввиду не конкретную ноду N_Own_Subscr_Not_Fill, а любую ноду с пустым text() (?)

Код: sql
1.
2.
3.
4.
5.
select
 count(*) as Всего, 
 count(a.n.value('text()[1]','varchar(100)')) as Заполнено
from
 @xml.nodes('/item/*') a(n);
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035143
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: sql
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.
declare @xml xml =
'<item>
<F_Partner_Types title="Тип потребителя" type="value">1</F_Partner_Types>
<C_Subscr_Code title="Лицевой счет" type="value">602060007031</C_Subscr_Code>
<N_Own_Subscr_Not_Fill title="Отказ от заполнения" type="value"/>
<N_Longitude title="Долгота" type="value">45.05138072</N_Longitude>
</item>'

;with cte as (
	select 
		lvl	=1
		,name	=t.c.value('local-name(.)', 'varchar(100)') 
		,val	=t.c.value('text()[1]', 'varchar(100)') 
		,xml	=@xml 
	from @xml.nodes('/item/*[1]') as t(c)

	union all

	select
		cte.lvl + 1
		,t.c.value('local-name(.)', 'varchar(100)') 
		,t.c.value('text()[1]', 'varchar(100)')
		,cte.xml
	from cte cross apply cte.xml.nodes('/item/*[sql:column("lvl")+1]') as t(c)
)
select lvl, name, val from cte


lvlnameval1F_Partner_Types12C_Subscr_Code6020600070313N_Own_Subscr_Not_FillNULL4N_Longitude45.05138072
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035254
court, спасибо! Да, это и нужно было. Вот это синтаксис... Просто китайская азбука пока для меня :) Буду изучать
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035265
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court,

Можно гораздо проще
Код: sql
1.
2.
3.
4.
5.
6.
select
 row_number() over (order by a.n),
 a.n.value('local-name(.)', 'varchar(100)'),
 a.n.value('text()[1]', 'varchar(100)')
from
 @xml.nodes('/item/*') a(n);
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035274
invm, спасибо!
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035311
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
court,

Можно гораздо проще
Код: sql
1.
2.
3.
4.
5.
6.
select
 row_number() over (order by a.n),
 a.n.value('local-name(.)', 'varchar(100)'),
 a.n.value('text()[1]', 'varchar(100)')
from
 @xml.nodes('/item/*') a(n);

да, так действительно проще. Спасибо !

Скажите, а вот это "поведение" row_number-а, конкретно order by a.n оно документировано ?
... я как-то не могу понять по чём оно, собственно, сортирует ))

Код: sql
1.
2.
3.
4.
5.
6.
7.
select 
 a.n.query('.'),
 row_number() over (order by a.n),
 a.n.value('local-name(.)', 'varchar(100)'),
 a.n.value('text()[1]', 'varchar(100)')
from
 @xml.nodes('/item/*') a(n);


(No column name)(No column name)(No column name)(No column name)<F_Partner_Types title="Тип потребителя" type="value">1</F_Partner_Types>1F_Partner_Types1<C_Subscr_Code title="Лицевой счет" type="value">602060007031</C_Subscr_Code>2C_Subscr_Code602060007031<N_Own_Subscr_Not_Fill title="Отказ от заполнения" type="value" />3N_Own_Subscr_Not_FillNULL<N_Longitude title="Долгота" type="value">45.05138072</N_Longitude>4N_Longitude45.05138072
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035340
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
court
Скажите, а вот это "поведение" row_number-а, конкретно order by a.n оно документировано ?
Нет. По крайней мере, я не находил.
Но работает с 2005-го.
...
Рейтинг: 0 / 0
Xml перебрать значения в цикле
    #40035380
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
invm
court
Скажите, а вот это "поведение" row_number-а, конкретно order by a.n оно документировано ?
Нет. По крайней мере, я не находил.
Но работает с 2005-го.
Спасибо
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Xml перебрать значения в цикле
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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