Как загрузить файл XML в базу данных с помощью пакета служб SSIS? - PullRequest
16 голосов
/ 01 марта 2011

Я использую SSIS в Visual Studio 2008. У меня есть много файлов XML, которые мне нужно обработать и поместить в существующую структуру БД (SQL Server 2005). Это моя первая попытка использования SSIS, и я немного застрял. Я нашел задачу потока данных XML, назначил ей тестовый XML-файл и связанный с ним XSD и сопоставил один узел с таблицей базы данных. У меня вопрос, как мне связать много узлов xsd со многими таблицами? Конечно, мне не нужно настраивать источник XML для каждой таблицы?

Ответы [ 2 ]

44 голосов
/ 03 июня 2011

Вот возможный вариант, который демонстрирует, как загрузить несколько файлов XML с одинаковым определением в таблицу SQL Server. В примере используются SQL Server 2008 R2 и SSIS 2008 R2. Показанный здесь пример загружает три файла XML в таблицу SQL, используя SSIS Data Flow Task с помощью компонента XML Source.

Пошаговый процесс:

  1. Создайте таблицу с именем dbo.Items, используя скрипт, указанный в разделе Сценарии SQL section.
  2. Создайте файл XSD с именем Items.xsd в пути к папке C: \ temp \ xsd , используя содержимое, указанное в разделе Файл XSD .
  3. Создайте три XML-файла, а именно Items_1.xml, Items_2.xml и Items_3.xml в пути к папке C: \ temp \ xml , используя содержимое, предоставленное в разделе XML-файлы .
  4. В пакете создайте 3 переменные, а именно FileExtension, FilePath и FolderPath, как показано на скриншоте # 1 .
  5. В диспетчере соединений пакета создайте соединение OLE DB с именем SQLServer для подключения к экземпляру SQL Server, как показано на снимке экрана # 2 .
  6. На вкладке Control Flow поместите Foreach loop container и Data Flow Task в контейнер цикла Foreach, как показано на скриншоте # 3 .
  7. Настройте Foreach Loop container, как показано на скриншотах # 4 и # 5 .
  8. Дважды щелкните Data Flow Task, чтобы перейти на вкладку Data Flow. Поместите компонент XML Source и OLE DB Destination, как показано на скриншоте # 6 .
  9. Настройте XML Source, как показано на скриншоте # 7 и # 8 . Путь к файлу XML будет получен из переменной FilePath . Эта переменная будет заполнена Foreach Loop container.
  10. Настройте OLE DB Destination, как показано на скриншотах # 9 и # 10 .
  11. Снимки экрана # 11 и # 12 показывают выполнение пакета.
  12. Снимок экрана # 13 показывает данные таблицы до выполнения пакета. Снимок экрана # 14 показывает данные таблицы после выполнения пакета. Данные в таблице dbo.Items теперь содержат данные, представленные в трех файлах XML.

Надеюсь, это поможет.

Сценарии SQL:

CREATE TABLE [dbo].[Items](
    [Id] [int] IDENTITY(1,1) NOT NULL,
    [ItemNumber] [nvarchar](50) NOT NULL,
    [ItemName] [nvarchar](60) NOT NULL,
    [Price] [numeric](18, 2) NOT NULL,
CONSTRAINT [PK_Items] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY]
GO

XSD-файл

<xsd:schema xmlns:schema="ItemsXSDSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="http://schemas.microsoft.com/sqlserver/2004/sqltypes" targetNamespace="ItemsXSDSchema" elementFormDefault="qualified">
    <xsd:import namespace="http://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="http://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
    <xsd:element name="Items">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element minOccurs="0" maxOccurs="unbounded" name="Item">
                    <xsd:complexType>
                        <xsd:sequence>
                            <xsd:element name="Id" type="sqltypes:int" />
                            <xsd:element name="ItemNumber">
                                <xsd:simpleType>
                                    <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
                                        <xsd:maxLength value="20" />
                                    </xsd:restriction>
                                </xsd:simpleType>
                            </xsd:element>
                            <xsd:element name="ItemName">
                                <xsd:simpleType>
                                    <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
                                        <xsd:maxLength value="60" />
                                    </xsd:restriction>
                                </xsd:simpleType>
                            </xsd:element>
                            <xsd:element name="Price">
                                <xsd:simpleType>
                                    <xsd:restriction base="sqltypes:numeric">
                                        <xsd:totalDigits value="18" />
                                        <xsd:fractionDigits value="2" />
                                    </xsd:restriction>
                                </xsd:simpleType>
                            </xsd:element>
                        </xsd:sequence>
                    </xsd:complexType>
                </xsd:element>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

XML-файлы

Items_1.xml

<?xml version="1.0"?>
<Items xmlns="ItemsXSDSchema">  
    <Item>
        <Id>1</Id>
        <ItemNumber>I2345343</ItemNumber>
        <ItemName>Monitor</ItemName>
        <Price>299.99</Price>
    </Item>
</Items>

Items_2.xml

<?xml version="1.0"?>
<Items xmlns="ItemsXSDSchema">  
    <Item>
        <Id>1</Id>
        <ItemNumber>J1231231</ItemNumber>
        <ItemName>Mouse</ItemName>
        <Price>29.99</Price>
    </Item>
</Items>

Items_3.xml

<?xml version="1.0"?>
<Items xmlns="ItemsXSDSchema">  
    <Item>
        <Id>1</Id>
        <ItemNumber>K0456212</ItemNumber>
        <ItemName>Keyboard</ItemName>
        <Price>49.99</Price>
    </Item>
</Items>

Скриншот № 1:

1

Снимок экрана № 2:

2

Снимок экрана № 3:

3

Скриншот № 4:

4

Снимок экрана № 5:

5

Снимок экрана № 6:

6

Снимок экрана № 7:

7

Снимок экрана № 8:

8

Снимок экрана № 9:

9

Скриншот № 10:

10

Снимок экрана № 11:

11

Снимок экрана № 12:

12

Снимок экрана № 13:

13

Снимок экрана № 14:

13

1 голос
/ 28 апреля 2016

Вам также необходимо добавить @[user::FilePath] к [XML Source].[XMLData] в задаче потока данных, или пакет скажет исходный файл не найден после выполнения пакета.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...