web-dev-qa-db-fra.com

Comment charger un fichier XML dans une base de données à l'aide d'un package SSIS?

J'utilise SSIS dans Visual Studio 2008. J'ai de nombreux fichiers XML que je dois traiter et placer dans une structure de base de données existante (SQL Server 2005). C'est ma première tentative d'utilisation de SSIS et je suis un peu coincé. J'ai trouvé la tâche de flux de données XML, lui ai attribué un fichier xml de test et son XSD associé, et mappé un nœud à une table de base de données. Ma question est, comment puis-je associer plusieurs nœuds xsd à plusieurs tables? Je n'ai sûrement pas à configurer une source XML pour chaque table?

16
Ben

Voici une option possible qui montre comment charger plusieurs fichiers XML ayant la même définition dans une table SQL Server. L'exemple utilise SQL Server 2008 R2 et SSIS 2008 R2. L'exemple présenté ici charge trois fichiers XML dans une table SQL à l'aide de SSIS Data Flow Task avec l'aide de XML Source composant.

Processus étape par étape:

  1. Créez une table nommée dbo.Items en utilisant le script donné sous SQL Scripts section.
  2. Créez un fichier XSD nommé Items.xsd dans le chemin du dossier C:\temp\xsd en utilisant le contenu fourni dans la section Fichier XSD.
  3. Créez trois fichiers XML à savoir Items_1.xml, Items_2.xml et Items_3.xml dans le chemin du dossier C:\temp\xml en utilisant le contenu fourni dans la section Fichiers XML.
  4. Sur le package, créez 3 variables à savoir FileExtension, FilePath et FolderPath comme indiqué dans la capture d'écran # 1.
  5. Sur les gestionnaires de connexions du package, créez une connexion de base de données OLE nommée SQLServer pour vous connecter à l'instance SQL Server comme illustré dans la capture d'écran # 2.
  6. Sur le Control Flow tab, placez un Foreach loop container et un Data Flow Task dans le conteneur de boucle Foreach, comme illustré dans la capture d'écran # .
  7. Configurez le Foreach Loop container comme illustré dans les captures d'écran # 4 et # 5.
  8. Double-cliquez sur le Data Flow Task pour accéder au Data Flow tab. Placez un XML Source composant et un OLE DB Destination comme illustré dans la capture d'écran # 6.
  9. Configurez le XML Source comme illustré dans la capture d'écran # 7 et # 8. Le chemin du fichier XML sera extrait de la variable FilePath. Cette variable sera remplie par le Foreach Loop container.
  10. Configurez le OLE DB Destination comme illustré dans les captures d'écran # 9 et # 1.
  11. Les captures d'écran # 11 et # 12 montrent l'exécution du package.
  12. La capture d'écran # 1 montre les données de la table avant l'exécution du package. La capture d'écran # 14 montre les données de la table après l'exécution du package. Les données du tableau dbo.Items contient désormais les données présentes dans trois fichiers XML.

J'espère que cela pourra aider.

Scripts 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

fichier 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>

Fichiers 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>

Capture d'écran # 1:

1

Capture d'écran # 2:

2

Capture d'écran # 3:

3

Capture d'écran # 4:

4

Capture d'écran # 5:

5

Capture d'écran n ° 6:

6

Capture d'écran # 7:

7

Capture d'écran # 8:

8

Capture d'écran # 9:

9

Capture d'écran # 10:

10

Capture d'écran # 11:

11

Capture d'écran # 12:

12

Capture d'écran # 13:

13

Capture d'écran # 14:

13

44
user756519

Vous devez également ajouter @[user::FilePath] à la [XML Source].[XMLData] dans la tâche de flux de données ou le package indique aucun fichier source trouvé après l'exécution du package.

1
SQLNoSQL