Импорт XML-канала веб-сайта в SQL Server

Надеюсь, у вас все хорошо.

Мне нужно импортировать XML-канал с веб-сайта в мою базу данных SQL Server. Я не очень разбираюсь в XML.

Структура подачи немного сложна. Вот образец этого файла:

<line_feed>
<FeedTime>1279519582927</FeedTime>
<lastContest>4103839</lastContest>
<lastGame>58629754</lastGame>
<events>
<event>
    <event_datetimeGMT>2010-07-19 21:30</event_datetimeGMT>
    <gamenumber>174087393</gamenumber>
    <sporttype>Tennis</sporttype>
    <league>abc</league>
    <participants>
        <participant>
            <participant_name>R. Ram</participant_name>
            <contestantnum>4303</contestantnum>
            <rotnum>4303</rotnum>
            <visiting_home_draw>Visiting</visiting_home_draw>
        </participant>
        <participant>
            <participant_name>K. Beck</participant_name>
            <contestantnum>4304</contestantnum>
            <rotnum>4304</rotnum>
            <visiting_home_draw>Home</visiting_home_draw>
        </participant>
    </participants>
    <periods>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-19 21:30</periodcutoff_datetimeGMT>
            <period_status>I</period_status>
            <period_update>open</period_update>
            <spread_maximum>250</spread_maximum>
            <moneyline_maximum>1500</moneyline_maximum>
            <total_maximum>250</total_maximum>
            <moneyline>
                <moneyline_visiting>135</moneyline_visiting>
                <moneyline_home>-146</moneyline_home>
            </moneyline>
        </period>
        <period>
            <period_number>0</period_number>
            <period_description>Game</period_description>
            <periodcutoff_datetimeGMT>2010-07-19 21:30</periodcutoff_datetimeGMT>
            <period_status>I</period_status>
            <period_update>open</period_update>
            <spread_maximum>250</spread_maximum>
            <moneyline_maximum>250</moneyline_maximum>
            <total_maximum>250</total_maximum>
            <spread>
                <spread_visiting>2</spread_visiting>
                <spread_adjust_visiting>101</spread_adjust_visiting>
                <spread_home>-2</spread_home>
                <spread_adjust_home>-118</spread_adjust_home>
            </spread>
            <total>
                <total_points>22.5</total_points>
                <over_adjust>-108</over_adjust>
                <under_adjust>-108</under_adjust>
            </total>
        </period>
        <period>
            <period_number>1</period_number>
            <period_description>1st Set</period_description>
            <periodcutoff_datetimeGMT>2010-07-19 21:30</periodcutoff_datetimeGMT>
            <period_status>I</period_status>
            <period_update>open</period_update>
            <spread_maximum>5000</spread_maximum>
            <moneyline_maximum>250</moneyline_maximum>
            <total_maximum>5000</total_maximum>
            <moneyline>
                <moneyline_visiting>114</moneyline_visiting>
                <moneyline_home>-133</moneyline_home>
            </moneyline>
        </period>
    </periods>
</event>
</events>
</line_feed>

Не могли бы вы помочь мне, как я могу загрузить данные из этого канала в SQL Server.

Пожалуйста, также спросите меня, нужны ли какие-либо другие детали для понимания этого сценария. В ожидании вашего любезного ответа.

Спасибо, Прашант


person Prashant    schedule 21.07.2010    source источник
comment
Несоответствие тегов в <FeedTime>1279519582927</PinnacleFeedTime>; это опечатка или ваш реальный фид искажен?   -  person Andomar    schedule 21.07.2010
comment
Спасибо, что заметили опечатку, исправил.   -  person Prashant    schedule 21.07.2010
comment
Данные выглядят довольно прямолинейно, в основном это просто вложенные записи. Итак... когда вы говорите загрузить данные из этого потока на сервер SQL - вы хотите взять данные, разобрать их на данные (записи) для использования в вашей базе данных? И если да, вы собираетесь делать это в самом SQL Server или с помощью внешнего приложения?   -  person Murph    schedule 21.07.2010
comment
Мы хотим импортировать данные из XMLfeed в таблицы SQL Server, я считаю, что нам нужно более одной таблицы для заполнения данных. Мы не используем какое-либо внешнее приложение, хотим напрямую анализировать в SQL Server. Пожалуйста помоги.   -  person Prashant    schedule 22.07.2010


Ответы (2)


Если ваш XML правильно сформирован, вы можете сохранить его в переменной типа xml. Затем вы можете использовать XPath для чтения полей из него:

declare @xml xml
set @xml = '
<line_feed>
<PinnacleFeedTime>1279519582927</PinnacleFeedTime>
...
'

select @xml.value('(line_feed/events/event/sporttype)[1]', 'VARCHAR(8000)')

Это напечатает Tennis.

person Andomar    schedule 21.07.2010

Это полностью зависит от того, что вы хотите извлечь из своего фида....

Я предполагаю, что ваш XML хранится в переменной SQL Server следующим образом:

DECLARE @input XML 

Этот запрос здесь будет перечислять все узлы <participants> и извлекать всю информацию об одном участнике — вы можете использовать это, чтобы вставить этих участников в таблицу:

SELECT
    Feed.Participant.value('(participant_name)[1]', 'varchar(50)') AS ParticipantName,
    Feed.Participant.value('(contestantnum)[1]', 'int') AS ContestantNum,
    Feed.Participant.value('(rotnum)[1]', 'int') AS RotNum,
    Feed.Participant.value('(visiting_home_draw)[1]', 'varchar(50)') AS VisitingHome
FROM
    @input.nodes('/line_feed/events/event/participants/participant') AS Feed(Participant)

Выход:

ParticipantName ContestantNum   RotNum  VisitingHome
R. Ram                  4303        4303     Visiting
K. Beck                 4304        4304     Home

Этот второй запрос перечисляет <period> узлов в вашей ленте — опять же, он извлекает некоторую информацию, которую вы можете использовать для хранения в таблице базы данных:

SELECT
    Feed.Period.value('(period_number)[1]', 'int') AS PeriodNumber,
    Feed.Period.value('(period_description)[1]', 'varchar(50)') AS PeriodDescription,
    Feed.Period.value('(period_status)[1]', 'varchar(50)') AS Status,
    Feed.Period.value('(period_update)[1]', 'varchar(50)') AS Update,
    Feed.Period.value('(moneyline_maximum)[1]', 'decimal(18,4)') AS MoneylineMaximum
FROM
    @input.nodes('/line_feed/events/event/periods/period') AS Feed(Period)

Выход:

PeriodNumber   PeriodDescription   Status  Update  MoneylineMaximum
    0             Game                I     open      1500.0000
    0             Game                I     open       250.0000
    1             1st Set             I     open       250.0000
person marc_s    schedule 21.07.2010