powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Динамический SQL из XML
5 сообщений из 5, страница 1 из 1
Динамический SQL из XML
    #37280910
Здравствуйте.

Есть XML вида
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
<AccInfo>
  <AccBalance>
    <AccType> 100 </AccType>
    <BalanceFrom> 10 </BalanceFrom>
    <BalanceTo> 999 </BalanceTo>
  </AccBalance>
  <AccBalance>
    <AccType> 300 </AccType>
    <BalanceFrom> 1 </BalanceFrom>
    <BalanceTo> 2 </BalanceTo>
  </AccBalance>
</AccInfo>

Ветвей <AccBalance> может быть 0 и более.

Хочу из этого сформировать SQL-запрос посредством XQuery.
Запрос вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
select ...
from ...
where 
(AccType =  100  AND Balance >=  10  AND Balance <=  999 ) 
OR 
(AccType =  300  AND Balance >=  1  AND Balance <=  2 )

Работаю в SSMS с Microsoft SQL Server 2005 - 9.00.5000.00 (X64) Dec 10 2010 10:38:40 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 5.2 (Build 3790: Service Pack 2).
Делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE @X AS XML
SET @X = '<AccInfo>
  <AccBalance>
    <AccType>100</AccType>
    <BalanceFrom>10</BalanceFrom>
    <BalanceTo>999</BalanceTo>
  </AccBalance>
  <AccBalance>
    <AccType>300</AccType>
    <BalanceFrom>1</BalanceFrom>
    <BalanceTo>2</BalanceTo>
  </AccBalance>
</AccInfo>'

SELECT @X.query('data(/AccInfo/AccBalance[1])')

Возвращаются данные только из первой ветки и без разделителей, что плохо. Подскажите, пожалуйста, как достать данные.
...
Рейтинг: 0 / 0
Динамический SQL из XML
    #37280965
Еще пробую
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
DECLARE @X AS XML
SET @X = '<AccInfo>
  <AccBalance>
    <AccType>100</AccType>
    <BalanceFrom>10</BalanceFrom>
    <BalanceTo>999</BalanceTo>
  </AccBalance>
  <AccBalance>
    <AccType>300</AccType>
    <BalanceFrom>1</BalanceFrom>
    <BalanceTo>2</BalanceTo>
  </AccBalance>
</AccInfo>'

SELECT @X.query('
for $i in (0 to count(/AccInfo/AccBalance))
data(/AccInfo/AccBalance[$i])')

Но, блин, возвращает ошибку
Код: plaintext
1.
2.
Msg 9335, Level 16, State 1, Line 18
XQuery [query()]: The XQuery syntax 'to' is not supported.
...
Рейтинг: 0 / 0
Динамический SQL из XML
    #37280975
refreg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сколково-тян,

Форумом ошибся - тебе в MS SQL... Кстати, воспользуйся поиском по тому форуму...
...
Рейтинг: 0 / 0
Динамический SQL из XML
    #37281095
refreg,

Эээ, жаль.
Так или иначе, открыл для себя метод nodes(). Буду его мучать.
...
Рейтинг: 0 / 0
Динамический SQL из XML
    #37579973
StPatrick
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мало ли кому пригодится
Если запрос с помощью XQuery то так

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
declare @xml xml

select @xml = '
<AccInfo>
  <AccBalance>
    <AccType>100</AccType>
    <BalanceFrom>10</BalanceFrom>
    <BalanceTo>999</BalanceTo>
  </AccBalance>
  <AccBalance>
    <AccType>300</AccType>
    <BalanceFrom>1</BalanceFrom>
    <BalanceTo>2</BalanceTo>
  </AccBalance>
</AccInfo>
'

select
	A.B.value('AccType[1]', 'bigint') as AccType,
	A.B.value('BalanceFrom[1]', 'bigint') as BalanceFrom,
	A.B.value('BalanceTo[1]', 'bigint') as BalanceTo
from @xml.nodes('/AccInfo') as T(C)
	outer apply T.C.nodes('AccBalance[AccType[1] = 100 and BalanceFrom[1] >= 10 and BalanceTo[1] <= 999 or AccType[1] = 300 and BalanceFrom[1] >= 1 and BalanceTo[1] <= 2]') as A(B)



можно просто вытащить все в SQL, а потом value проверить.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / XML, XSL, XPath, XQuery [игнор отключен] [закрыт для гостей] / Динамический SQL из XML
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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