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

Откуда: урал
Сообщений: 2850
Хранимая процедура занимается парсингом XML разбрасыванием данных по нужным таблицам
Имеется следующий XML:

<root>
<parent>
 <parent_value1>1</parent_value1>
 <child>
  <child_field1>hello1</child_field1>
  <child_field2>hello2</child_field2>
  <child_field3>hello3</child_field3>
 </child>
</parent>

<parent>
 <parent_value1>2</parent_value1>
 <child>
  <child_field1>hello5</child_field1>
  <child_field2>hello6</child_field2>
  <child_field3>hello7</child_field3>
 </child>
</parent>
</root>


т.е. 2 записи parent, каждая из которых включает свой child с соответствующими значениями. Если я теперь выполню селект из хмл:


SELECT   child
	,@income
	,ROW_NUMBER() OVER (ORDER BY [BankAccountNo])
	,[BankAccountNo]
	,[AccountType]
	,[NoOfClearanceRejected]
	,[NoOfDepositRejected]
	,[TotalDebitTransaction]
	,[TotalCreditTransaction]
	,[TotalClosingBalance]
	,[AverageDebitTransaction]
	,[AverageCreditTransaction]
	,[AverageClosingBalance]
from OPENXML(@iDoc, '/root/parent/child', 2) WITH (child_field1, child_field2, child_field3)



то он вернет мне оба child'a, как определить какой из них относится к какому паренту?
2 апр 13, 09:30    [14124527]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи только одного родителя из XML  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
sorry:

SELECT  child_field1, child_field2, child_field3
from OPENXML(@iDoc, '/root/parent/child', 2) WITH (child_field1, child_field2, child_field3)
2 апр 13, 09:32    [14124534]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи только одного родителя из XML  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
stenford,OPENXML используется из-за религиозных убеждений?
+ как-то так

declare @x xml = '<root>
<parent>
 <parent_value1>1</parent_value1>
 <child>
  <child_field1>hello1</child_field1>
  <child_field2>hello2</child_field2>
  <child_field3>hello3</child_field3>
 </child>
</parent>

<parent>
 <parent_value1>2</parent_value1>
 <child>
  <child_field1>hello5</child_field1>
  <child_field2>hello6</child_field2>
  <child_field3>hello7</child_field3>
 </child>
</parent>
</root>'

select z.z.query('.') 
,z.z.value('(parent_value1/text())[1]','int')
,z.z.value('(child/child_field1/text())[1]','varchar(50)')
,z.z.value('(child/child_field2/text())[1]','varchar(50)')
,z.z.value('(child/child_field3/text())[1]','varchar(50)')
from @x.nodes('root/parent') z(z)

2 апр 13, 09:44    [14124602]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи только одного родителя из XML  [new]
Ennor Tiegael
Member

Откуда:
Сообщений: 3422
from @x.nodes('root/parent[2]/child') t(c)
2 апр 13, 09:48    [14124621]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи только одного родителя из XML  [new]
stenford
Member

Откуда: урал
Сообщений: 2850
спасибо, а с OPENXML ничего нельзя сделать? Он используется т.к. автоматически генерируется из схемы хмл, без его использования тут появится масса ручной работы с переписыванием кода
2 апр 13, 10:15    [14124781]     Ответить | Цитировать Сообщить модератору
 Re: Выбрать записи только одного родителя из XML  [new]
Гость333
Member

Откуда:
Сообщений: 3683
stenford
спасибо, а с OPENXML ничего нельзя сделать?

Таки можно:
DECLARE @x NVARCHAR(MAX), @hdoc INT;

SET @x = N'<root>
<parent>
 <parent_value1>1</parent_value1>
 <child>
  <child_field1>hello1</child_field1>
  <child_field2>hello2</child_field2>
  <child_field3>hello3</child_field3>
 </child>
</parent>

<parent>
 <parent_value1>2</parent_value1>
 <child>
  <child_field1>hello5</child_field1>
  <child_field2>hello6</child_field2>
  <child_field3>hello7</child_field3>
 </child>
</parent>
</root>';

EXEC sp_xml_preparedocument @hdoc OUTPUT, @x;

SELECT  parent, child_field1, child_field2, child_field3
FROM OPENXML(@hdoc, '/root/parent/child', 2)
WITH (parent VARCHAR(100) '../parent_value1',
      child_field1 VARCHAR(100),
      child_field2 VARCHAR(100),
      child_field3 VARCHAR(100));

EXEC sp_xml_removedocument @hdoc;
2 апр 13, 14:12    [14126554]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить