Импорт из XML - PullRequest
       13

Импорт из XML

0 голосов
/ 13 июня 2018
DECLARE @index int 
DECLARE @XMLdoc varchar(8000)
SET @XMLdoc ='<Sales>
<Company>101</Company>
<Warehouse>S001</Warehouse>
<InvoiceNumber>1001</InvoiceNumber>
<Amount>1000.0000</Amount>
<CreateDate>20180527</CreateDate>
<Company>101</Company>
<Warehouse>S002</Warehouse>
<InvoiceNumber>1002</InvoiceNumber>
<Amount>2000.0000</Amount>
<CreateDate>20180527</CreateDate>
</Sales>'
EXEC sp_xml_preparedocument @index OUTPUT, @XMLdoc
SELECT * FROM OPENXML (@index, 'Sales',2)
WITH (Company int,Warehouse nvarchar(20),InvoiceNumber nvarchar(40),Amount 
nvarchar(10),CreateDate nvarchar(20))
EXEC sp_xml_removedocument @index

Приведенный выше запрос возвращает только одну строку, хотя данные в формате XML содержат две строки данных. Мне нужны обе строки в результате этого запроса.

1 Ответ

0 голосов
/ 13 июня 2018

Прежде всего: FROM OPENXML вместе с соответствующими СП для подготовки и удаления документа устарели и больше не должны использоваться.Вместо этого используйте методы собственного типа XML.

Предполагая, что две строки означают два <Sales> блоков Я хотел бы предложить следующее:

DECLARE @XMLdoc XML=
N'<Sales>
  <Company>101</Company>
  <Warehouse>S001</Warehouse>
  <InvoiceNumber>1001</InvoiceNumber>
  <Amount>1000.0000</Amount>
  <CreateDate>20180527</CreateDate>
  <Company>101</Company>
  <Warehouse>S002</Warehouse>
  <InvoiceNumber>1002</InvoiceNumber>
  <Amount>2000.0000</Amount>
  <CreateDate>20180527</CreateDate>
</Sales>
<Sales>
  <Company>999</Company>
  <Warehouse>999</Warehouse>
  <InvoiceNumber>999</InvoiceNumber>
  <Amount>1000.0000</Amount>
  <CreateDate>20180527</CreateDate>
  <Company>101</Company>
  <Warehouse>S002</Warehouse>
  <InvoiceNumber>1002</InvoiceNumber>
  <Amount>2000.0000</Amount>
  <CreateDate>20180527</CreateDate>
</Sales>';

SELECT s.value(N'(Company/text())[1]',N'int') AS Company
      ,s.value(N'(Warehouse/text())[1]',N'nvarchar(max)') AS Warehouse
      ,s.value(N'(InvoiceNumber/text())[1]',N'int') AS InvoiceNumber
      ,s.value(N'(Amount/text())[1]',N'decimal(14,6)') AS Amount
      --and so on
FROM @XMLdoc.nodes(N'/Sales') AS A(s) 

ОБНОВЛЕНИЕ (Пожалуйста, избегайте дополнительных вопросов!)

Ваш комментарий с запросом атрибутов указывает на что-то вроде этого:

SELECT 101 AS [@Company]
      ,Warehouse
      --more elements
FROM SomeWhere
FOR XML PATH('Idocs'),ROOT('Sales');
...