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

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

Ответы

Ответ 1

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

Шаг за шагом:

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

<Т411 >

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

13

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

13

Ответ 2

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