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

Откуда:
Сообщений: 29
Может я уже и достал кого-то своим xml, но поверьте сижу безвылазно с ним, и читаю, и почти все готово, осталась одна загвоздка.
Буду благодарен.

При импорте результат только одна строка, но данных больше(бывает и десять строк должно быть). Выводит только данные первого <rosterItem>.


DECLARE @xml XML, @hxml INT,@FileName varchar(50)


SET @xml = '<issuance xmlns="http://www.w3schools.com" sender="700002794">
    <general>
        <number>700002794-2016-0000380328</number>
        <dateIssuance>2016-06-01</dateIssuance>
        <dateTransaction>2016-05-31</dateTransaction>
        <documentType>ORIGINAL</documentType>
    </general>
    <roster totalCostVat="239090.497" totalExcise="0.0" totalVat="0.0" totalCost="239090.497">
        <rosterItem>
            <number>0</number>
            <name>ЛЕНТА ЭЛАСТИЧНАЯ ЖАККАРДОВАЯ</name>
            <code>5806200000</code>
            <count>0.0</count>
            <price>0.0</price>
            <cost>94484.497</cost>
            <summaExcise>0.0</summaExcise>
            <vat>
                <rate>0</rate>
                <rateType>ZERO</rateType>
                <summaVat>0.0</summaVat>
            </vat>
            <costVat>94484.497</costVat>
            <descriptions>
                <description>OUTSIDE_RB</description>
            </descriptions>
        </rosterItem>
        <rosterItem>
            <number>0</number>
            <name>ЛЕНТА ПРИКЛАДНАЯ</name>
            <code>5806321000</code>
            <count>0.0</count>
            <price>0.0</price>
            <cost>144606.0</cost>
            <summaExcise>0.0</summaExcise>
            <vat>
                <rate>0</rate>
                <rateType>ZERO</rateType>
                <summaVat>0.0</summaVat>
            </vat>
            <costVat>144606.0</costVat>
            <descriptions>
                <description>OUTSIDE_RB</description>
            </descriptions>
        </rosterItem>
    </roster>
</issuance>'

EXEC sp_xml_preparedocument @hxml OUT,@xml, '<root xmlns:ns="http://www.w3schools.com" />'

SELECT *
FROM OPENXML(@hxml,'/ns:issuance',2)
WITH
(
[number_tov] int './ns:roster/ns:rosterItem/ns:number',
[name_tov] nvarchar(250) './ns:roster/ns:rosterItem/ns:name',
[code] nchar(10) './ns:roster/ns:rosterItem/ns:code',
[code_oced_tov] nvarchar(50) './ns:roster/ns:rosterItem/ns:code_oced',
[units] nvarchar(50) './ns:roster/ns:rosterItem/ns:units',
[count_tov] numeric(18,0) './ns:roster/ns:rosterItem/ns:count',
[price_tov] numeric(18,2) './ns:roster/ns:rosterItem/ns:price',
[cost] numeric(18,5) './ns:roster/ns:rosterItem/ns:cost',
[summaExcise] numeric(18,5) './ns:roster/ns:rosterItem/ns:summaExcise',
[rate] numeric (2,0) './ns:roster/ns:rosterItem/ns:vat/ns:rate',
[rateType] nvarchar(50) './ns:roster/ns:rosterItem/ns:vat/ns:rateType',
[summaVat] numeric(18,5) './ns:roster/ns:rosterItem//ns:vat/ns:summaVat',
[costVat] numeric(18,5) './ns:roster/ns:rosterItem/ns:costVat',
[description_tov] nvarchar(50) './ns:roster/ns:rosterItem/ns:descriptions/ns:description',
[number] nvarchar (25) './ns:general/ns:number'
) 
6 июн 16, 10:14    [19261361]     Ответить | Цитировать Сообщить модератору
 Re: импорт XML не видит все данные  [new]
Maxim696
Member

Откуда:
Сообщений: 29
Maxim696, Нашел как вывести все строки

SELECT *
FROM OPENXML(@hxml,'/ns:issuance/ns:roster/ns:rosterItem',2)
WITH
(
[number_post] numeric(18,0) './ns:deliveryCondition/ns:contract/ns:documents/ns:document/ns:number',
[number_tov] int './ns:number',
[name_tov] nvarchar(250) './ns:name',
[code] nchar(10) './ns:code',
[code_oced_tov] nvarchar(50) './ns:code_oced',
[units] nvarchar(50) './ns:units',
[count_tov] numeric(18,0) './ns:count',
[price_tov] numeric(18,2) './ns:price',
[cost] numeric(18,5) './ns:cost',
[summaExcise] numeric(18,5) './ns:summaExcise',
[rate] numeric (2,0) './ns:vat/ns:rate',
[rateType] nvarchar(50) './ns:vat/ns:rateType',
[summaVat] numeric(18,5) './ns:vat/ns:summaVat',
[costVat] numeric(18,5) './ns:costVat',
[description_tov] nvarchar(50) './ns:descriptions/ns:description',
[number] nvarchar (25) './ns:general/ns:number'
) 





Но вопрос как вывести значение
 [number] nvarchar (25) './ns:general/ns:number'
6 июн 16, 10:25    [19261411]     Ответить | Цитировать Сообщить модератору
 Re: импорт XML не видит все данные  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Потому что XPath для openxml выводит корневой узел, который только один, поэтому и запись выдается только одна. Если вам нужны элементы rosterItem, то их в XPath и задавайте:
EXEC sp_xml_preparedocument @hxml OUT,@xml, '<root xmlns:ns="http://www.w3schools.com" />'

SELECT *
FROM OPENXML(@hxml,'/ns:issuance/ns:roster/ns:rosterItem',2)
WITH
(
[number_tov] int 'ns:number',
[name_tov] nvarchar(250) 'ns:name',
[code] nchar(10) 'ns:code',
[code_oced_tov] nvarchar(50) 'ns:code_oced',
[units] nvarchar(50) 'ns:units',
[count_tov] numeric(18,0) 'ns:count',
[price_tov] numeric(18,2) 'ns:price',
[cost] numeric(18,5) 'ns:cost',
[summaExcise] numeric(18,5) 'ns:summaExcise',
[rate] numeric (2,0) 'ns:vat/ns:rate',
[rateType] nvarchar(50) 'ns:vat/ns:rateType',
[summaVat] numeric(18,5) 'ns:vat/ns:summaVat',
[costVat] numeric(18,5) 'ns:costVat',
[description_tov] nvarchar(50) 'ns:descriptions/ns:description',
[number] nvarchar (25) '../../ns:general/ns:number'
) 
6 июн 16, 10:27    [19261419]     Ответить | Цитировать Сообщить модератору
 Re: импорт XML не видит все данные  [new]
AlanDenton
Member [скрыт]

Откуда:
Сообщений: 1004
DECLARE @xml XML
SET @xml = N'
<issuance xmlns="http://www.w3schools.com" sender="700002794">
    <general>
        <number>700002794-2016-0000380328</number>
        <dateIssuance>2016-06-01</dateIssuance>
        <dateTransaction>2016-05-31</dateTransaction>
        <documentType>ORIGINAL</documentType>
    </general>
    <roster totalCostVat="239090.497" totalExcise="0.0" totalVat="0.0" totalCost="239090.497">
        <rosterItem>
            <number>0</number>
            <name>ЛЕНТА ЭЛАСТИЧНАЯ ЖАККАРДОВАЯ</name>
            <code>5806200000</code>
            <count>0.0</count>
            <price>0.0</price>
            <cost>94484.497</cost>
            <summaExcise>0.0</summaExcise>
            <vat>
                <rate>0</rate>
                <rateType>ZERO</rateType>
                <summaVat>0.0</summaVat>
            </vat>
            <costVat>94484.497</costVat>
            <descriptions>
                <description>OUTSIDE_RB</description>
            </descriptions>
        </rosterItem>
        <rosterItem>
            <number>0</number>
            <name>ЛЕНТА ПРИКЛАДНАЯ</name>
            <code>5806321000</code>
            <count>0.0</count>
            <price>0.0</price>
            <cost>144606.0</cost>
            <summaExcise>0.0</summaExcise>
            <vat>
                <rate>0</rate>
                <rateType>ZERO</rateType>
                <summaVat>0.0</summaVat>
            </vat>
            <costVat>144606.0</costVat>
            <descriptions>
                <description>OUTSIDE_RB</description>
            </descriptions>
        </rosterItem>
    </roster>
</issuance>'

;WITH XMLNAMESPACES(DEFAULT 'http://www.w3schools.com')
SELECT
      g.c.value('(number/text())[1]', 'nvarchar(25)')
    , ...
    , r.c.value('(name/text())[1]', 'nvarchar(250)')
FROM @xml.nodes('issuance') t(c)
CROSS APPLY t.c.nodes('general') g(c)
CROSS APPLY t.c.nodes('roster/rosterItem') r(c)

Большая просьба почитай про XQuery. Все эти ситуации описаны в справке достаточно детально

+

Не хочется читать, вот видео (там же и ссылка на примеры):

6 июн 16, 10:30    [19261432]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить