Présentation du chargement en masse XML (SQLXML 4.0)
Le chargement en masse XML est un objet COM autonome qui vous permet de charger des données XML semi-structurées dans des tables Microsoft SQL Server.
Vous pouvez insérer les données XML dans une base de données SQL Server à l'aide d'une instruction INSERT et de la fonction OPENXML ; toutefois, l'utilitaire de chargement en masse fournit de meilleures performances lorsque vous avez besoin d'insérer des quantités importantes de données XML.
La méthode Execute du modèle objet de chargement en masse XML accepte deux paramètres :
Un schéma XSD (XML Schema Definition)) ou XDR (XML-Data Reduced) annoté. L'utilitaire de chargement en masse XML interprète ce schéma de mappage et les annotations spécifiées dans le schéma pour identifier les tables SQL Server dans lesquelles les données XML doivent être insérées.
Un document ou un fragment de document XML (un fragment de document est un document sans élément de niveau supérieur unique). Un nom de fichier ou un flux pouvant être lu par le chargement en masse XML peut être spécifié.
Le chargement en masse XML interprète le schéma de mappage et identifie le ou les tables dans lesquelles les données XML doivent être insérées.
Cette rubrique suppose que vous connaissez bien les fonctionnalités SQL Server suivantes :
Schémas XSD et XDR annotés. Pour plus d'informations sur les schémas XSD annotés, consultez Introduction aux schémas XSD annotés (SQLXML 4.0). Pour plus d'informations sur les schémas XDR annotés, consultez Schémas XDR annotés (désapprouvés dans SQLXML 4.0).
Mécanismes d'insertion en bloc SQL Server, tels que l'instruction Transact-SQL BULK INSERT et l'utilitaire bcp. Pour plus d'informations, consultez BULK INSERT (Transact-SQL) et Utilitaire bcp.
Diffusion en continu de données XML
Le document XML source pouvant être volumineux, le document n'est pas lu intégralement en mémoire au cours du traitement de chargement en masse. Au lieu de cela, le chargement en masse XML interprète les données XML en tant que flux et lit ce flux. À mesure que l'utilitaire lit les données, il identifie la ou les tables de base de données, génère le ou les enregistrements appropriés à partir de la source de données XML, puis envoie le ou les enregistrements à SQL Server à des fins d'insertion.
Par exemple, le document XML source suivant comprend des éléments <Customer> et des éléments enfants <Order> :
<Customer ...>
<Order.../>
<Order .../>
...
</Customer>
...
À mesure que le chargement en masse XML lit l'élément <Customer>, il génère un enregistrement pour la table Customer. Lorsqu'il lit la balise de fin </Customer>, le chargement en masse XML insère cet enregistrement dans la table dans SQL Server. De la même façon, lorsqu'il lit l'élément <Order>, le chargement en masse XML génère un enregistrement pour la table Order, puis insère cet enregistrement dans la table SQL Server à la suite de la lecture de la balise de fin </Order>.
Opérations de chargement en masse XML transactionnelles et non transactionnelles
Le chargement en masse XML peut fonctionner en mode transactionnel ou non transactionnel. Les performances sont en général optimisées si vous effectuez le chargement en masse en mode non transactionnel (c'est-à-dire que la propriété Transaction a la valeur FALSE) et que l'une ou l'autre des conditions suivantes est remplie :
Les tables dans lesquelles les données sont chargées en masse sont vides et ne comprennent pas d'index.
Les tables ont des données et des index uniques.
L'approche non transactionnelle ne garantit pas de restauration en cas de problème dans le processus de chargement en masse (bien que des restaurations partielles puissent se produire). Le chargement en masse non transactionnel est approprié lorsque la base de données est vide. Par conséquent, en cas de problème, vous pouvez nettoyer la base de données et redémarrer le chargement en masse XML.
[!REMARQUE]
En mode non transactionnel, le chargement en masse XML utilise une transaction interne par défaut et la valide. Lorsque la propriété Transaction a la valeur TRUE, le chargement en masse XML n'appelle pas de validation sur cette transaction.
Si la propriété Transaction a la valeur TRUE, le chargement en masse XML crée des fichiers temporaires, un pour chaque table identifiée dans le schéma de mappage. Le chargement en masse XML commence par stocker les enregistrements du document XML source dans ces fichiers temporaires. Ensuite, une instruction Transact-SQL BULK INSERT récupère ces enregistrements des fichiers et les stocke dans les tables correspondantes. Vous pouvez spécifier l'emplacement de ces fichiers temporaires à l'aide de la propriété TempFilePath. Vous devez vous assurer que le compte SQL Server utilisé avec le chargement en masse XML a accès à ce chemin d'accès. Si la propriété TempFilePath n'est pas spécifiée, le chemin d'accès par défaut spécifié dans la variable d'environnement TEMP est utilisé pour créer les fichiers temporaires.
Si la propriété Transaction a la valeur FALSE (paramètre par défaut), le chargement en masse XML utilise l'interface OLE DB IRowsetFastLoad pour charger en masse les données.
Si la propriété ConnectionString définit la chaîne de connexion et que la propriété Transaction a la valeur TRUE, le chargement en masse XML fonctionne dans son propre contexte de transaction. (Par exemple, le chargement en masse XML démarre sa propre transaction, puis effectue une validation ou une restauration comme il convient.)
Si la propriété ConnectionCommand définit la connexion avec un objet de connexion existant et que la propriété Transaction a la valeur TRUE, le chargement en masse XML n'émet pas d'instruction COMMIT ou ROLLBACK en cas de réussite ou d'échec, respectivement. En cas d'erreur, le chargement en masse XML retourne le message d'erreur approprié. La décision d'émettre une instruction COMMIT ou ROLLBACK appartient au client qui a initialisé le chargement en masse. L'objet de connexion utilisé pour le chargement en masse XML doit être du type ICommand ou un objet de commande ADO.
Dans SQLXML 4.0, un ConnectionObject ne peut pas être utilisé avec la propriété Transaction ayant la valeur FALSE. Le mode non transactionnel n'est pas pris en charge avec un ConnectionObject parce qu'il est impossible d'ouvrir plusieurs interfaces IRowsetFastLoad dans le cadre d'une session passée en entrée.