Partager via


Exécution d'opérations de copie en bloc

La fonction de copie en bloc de SQL Server prend en charge le transfert de quantités importantes de données vers ou depuis une table ou une vue SQL Server. Les données peuvent également être transférées en spécifiant une instruction SELECT. Les données peuvent être déplacées entre SQL Server et un fichier de données du système d'exploitation, par exemple un fichier ASCII. Le fichier de données peut avoir différents formats ; le format est défini pour effectuer la copie en bloc dans un fichier de format. Facultativement, les données peuvent être chargées dans des variables de programme et transférées vers SQL Server à l'aide de fonctions et de méthodes de copie en bloc.

CodePlex contient un exemple d'application qui illustre cette fonctionnalité ; consultez Exemples pour le moteur de base de données SQL Server pour plus d'informations.

Une application utilise en général la copie en bloc de l'une des manières suivantes :

  • Effectuer une copie en bloc à partir d'une table, d'une vue ou du jeu de résultats d'une instruction Transact-SQL dans un fichier de données où les données sont stockées dans le même format que la table ou la vue.

    On parle de « fichier de données en mode natif ».

  • Effectuer une copie en bloc à partir d'une table, d'une vue ou du jeu de résultats d'une instruction Transact-SQL dans un fichier de données où les données sont stockées dans un format différent de celui de la table ou de la vue.

    Dans ce cas, un fichier de format séparé est créé qui définit les caractéristiques (type de données, position, longueur, terminateur, etc.) de chaque colonne à mesure que les colonnes sont stockées dans le fichier de données. Si toutes les colonnes sont converties en format caractère, le fichier résultant est appelé un « fichier de données en mode caractère ».

  • Effectuer une copie en bloc à partir d'un fichier de données dans une table ou une vue.

    Si nécessaire, un fichier de format est utilisé pour déterminer la structure du fichier de données.

  • Charger des données dans des variables de programme, puis importer les données dans une table ou une vue à l'aide des fonctions de copie en bloc pour effectuer la copie en bloc dans une ligne à la fois.

Il n'est pas nécessaire que les fichiers de données utilisés par les fonctions de copie en bloc soient créés par un autre programme de copie en bloc. Tout autre système peut générer un fichier de données et un fichier de format conformément aux définitions de la copie en bloc ; ces fichiers peuvent ensuite être utilisés avec un programme de copie en bloc SQL Server pour importer des données dans SQL Server. Par exemple, vous pouvez exporter des données à partir d'une feuille de calcul dans un fichier délimité par des tabulations, générer un fichier de format décrivant le fichier délimité par des tabulations, puis utilisez un programme de copie en bloc pour importer rapidement les données dans SQL Server. Les fichiers de données générés par la copie en bloc peuvent également être importés dans d'autres applications. Par exemple, vous pouvez utiliser des fonctions de copie en bloc pour exporter les données d'une table ou d'une vue dans un fichier délimité par des tabulations que vous pouvez ensuite charger dans une feuille de calcul.

[!REMARQUE]

À compter de SQL Server 2005, lorsque vous utilisez l'utilitaire bcp, le serveur signale une erreur lorsque la troncation de données numériques se produit. SQL Server 2000 et versions antérieures retournaient seulement un avertissement. Cela peut poser des problèmes pour les applications existantes qui ignorent l'avertissement. Vous pouvez éviter ces problèmes en vous assurant que les données d'entrée ont des valeurs correctes qui ne seront pas tronquées ou en continuant d'utiliser la version SQL Server 2000 de bcp.

Les programmeurs qui codent des applications pour utiliser les fonctions de copie en bloc doivent respecter les règles générales pour obtenir de bonnes performances en matière de copie en bloc. Pour plus d'informations sur la prise en charge des opérations de copie en bloc dans SQL Server, consultez À propos des opérations d'exportation et d'importation en bloc.

Limitations et restrictions

Un type CLR défini par l'utilisateur (UDT) doit être lié en tant que données binaires. Même si un fichier de format spécifie SQLCHAR en tant que type de données pour une colonne UDT cible, l'utilitaire BCP traite les données en tant que données binaires.

N'utilisez pas SET FMTONLY OFF avec des opérations de copie en bloc. SET FMTONLY OFF peut entraîner l'échec de votre opération de copie en bloc ou générer des résultats inattendus.

Fournisseur OLE DB SQL Server Native Client

Le fournisseur OLE DB SQL Server Native Client implémente deux méthodes pour effectuer des opérations de copie en bloc avec une base de données SQL Server. La première méthode implique l'utilisation de l'interface IRowsetFastLoad pour les opérations de copie en bloc basées sur la mémoire, tandis que la seconde implique l'utilisation de l'interface IBCPSession pour les opérations de copie en bloc basées sur le fichier.

Utilisation d'opérations de copie en bloc basées sur la mémoire

Le fournisseur OLE DB SQL Server Native Client implémente l'interface IRowsetFastLoad pour exposer la prise en charge des opérations de copie en bloc basées sur la mémoire SQL Server. L'interface IRowsetFastLoad implémente les méthodes IRowsetFastLoad::Commit et IRowsetFastLoad::InsertRow.

Activation d'une session pour IRowsetFastLoad

Le consommateur notifie le fournisseur OLE DB SQL Server Native Client de son besoin en matière de copie en bloc en attribuant la valeur VARIANT_TRUE à la propriété SSPROP_ENABLEFASTLOAD de la source de données spécifique au fournisseur OLE DB SQL Server Native Client. Lorsque la propriété est définie sur la source de données, le consommateur crée une session du fournisseur OLE DB SQL Server Native Client. La nouvelle session permet au consommateur d'accéder à l'interface IRowsetFastLoad.

[!REMARQUE]

Si l'interface IDataInitialize est utilisée pour initialiser la source de données, vous devez alors définir la propriété SSPROP_IRowsetFastLoad dans le paramètre rgPropertySets de la méthode IOpenRowset::OpenRowset ; sinon, l'appel à la méthode OpenRowset retourne E_NOINTERFACE.

L'activation d'une session pour la copie en bloc limite la prise en charge du fournisseur OLE DB SQL Server Native Client aux interfaces sur la session. Une session compatible avec la copie en bloc expose uniquement les interfaces suivantes :

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

Pour désactiver la création d'ensembles de lignes compatibles avec la copie en bloc et forcer la session du fournisseur OLE DB SQL Server Native Client à rétablir le traitement standard, attribuez la valeur VARIANT_FALSE à SSPROP_ENABLEFASTLOAD.

Ensembles de lignes IRowsetFastLoad

Les ensembles de lignes de copie en bloc du fournisseur OLE DB SQL Server Native Client sont en écriture seule, mais ils exposent des interfaces qui permettent au consommateur de déterminer la structure d'une table SQL Server. Les interfaces suivantes sont exposées sur un ensemble de lignes du fournisseur OLE DB SQL Server Native Client compatible avec la copie en bloc :

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

Les propriétés spécifiques au fournisseur SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS et SSPROP_FASTLOADKEEPIDENTITY contrôlent les comportements d'un ensemble de lignes de copie en bloc du fournisseur OLE DB SQL Server Native Client. Les propriétés sont spécifiées dans le membre rgProperties d'un membre de paramètre rgPropertySetsIOpenRowset.

ID de propriété

Description

SSPROP_FASTLOADKEEPIDENTITY

Colonne : non

Lecture/Écriture : lecture/écriture

Type : VT_BOOL

Valeur par défaut : VARIANT_FALSE

Description : Maintient les valeurs d'identité fournies par le consommateur.

VARIANT_FALSE : les valeurs pour une colonne d'identité dans la table SQL Server sont générées par SQL Server. Toute valeur liée pour la colonne est ignorée par le fournisseur OLE DB SQL Server Native Client.

VARIANT_TRUE : le consommateur lie un accesseur qui fournit une valeur pour une colonne d'identité SQL Server. La propriété d'identité n'étant pas disponible sur les colonnes qui acceptent NULL, le consommateur fournit une valeur unique sur chaque appel de IRowsetFastLoad::Insert.

SSPROP_FASTLOADKEEPNULLS

Colonne : non

Lecture/Écriture : lecture/écriture

Type : VT_BOOL

Valeur par défaut : VARIANT_FALSE

Description : maintient la valeur NULL pour les colonnes avec une contrainte DEFAULT. Affecte uniquement les colonnes SQL Server qui acceptent NULL et auxquelles une contrainte DEFAULT est appliquée.

VARIANT_FALSE : SQL Server insère la valeur par défaut pour la colonne lorsque le consommateur du fournisseur OLE DB SQL Server Native Client insère une ligne contenant NULL pour la colonne.

VARIANT_TRUE : SQL Server insère NULL pour la valeur de colonne lorsque le consommateur du fournisseur OLE DB SQL Server Native Client insère une ligne contenant NULL pour la colonne.

SSPROP_FASTLOADOPTIONS

Colonne : non

Lecture/Écriture : lecture/écriture

Type : VT_BSTR

Valeur par défaut : aucune

Description : cette propriété équivaut à l'option -h "hint[,...n]" de l'utilitaire bcp. La ou les chaînes suivantes peuvent être utilisées en tant qu'options pour la copie en bloc de données dans une table.

ORDER(column[ASC | DESC][,...n]) : ordre de tri des données dans le fichier de données. Les performances de la copie en bloc peuvent être améliorées si le fichier de données à charger est trié conformément à l'index cluster de la table.

ROWS_PER_BATCH = bb : nombre de lignes de données par lot (bb). Le serveur optimise le chargement en masse en fonction de la valeur de bb. Par défaut, ROWS_PER_BATCH est inconnu.

KILOBYTES_PER_BATCH = cc : nombre de kilo-octets (Ko) de données par lot (cc). Par défaut, KILOBYTES_PER_BATCH est inconnu.

TABLOCK: un verrou au niveau de la table est acquis pour la durée de l'opération de copie en bloc. Cette option augmente sensiblement les performances car le maintien d'un verrou uniquement pour la durée de la seule opération de copie en bloc réduit le taux de verrouillage de la table. Une table peut être chargée simultanément par plusieurs clients si elle ne comporte pas d'index et si TABLOCK est spécifié. Par défaut, le comportement du verrouillage est déterminé par l'option de table table lock on bulk load.

CHECK_CONSTRAINTS : toutes les contraintes sur table_name sont vérifiées pendant l'opération de copie en bloc. Par défaut, les contraintes sont ignorées.

FIRE_TRIGGER : dans SQL Server 2000, avec les déclencheurs activés, la journalisation ne pouvait être optimisée car la logique des déclencheurs était basée sur les enregistrements du journal. Pendant une opération d'importation en bloc avec les déclencheurs activés, toutes les optimisations de journalisation en bloc (y compris les verrous BU) étaient désactivées.

Toutefois, à compter de SQL Server 2005, SQL Server utilise le contrôle de version des lignes pour les déclencheurs et stocke les versions des lignes dans la banque des versions de tempdb. Par conséquent, les optimisations de journalisation en bloc sont disponibles même lorsque les déclencheurs sont activés. Avant de procéder à l'importation en bloc d'un lot comptant un nombre important de lignes avec les déclencheurs activés, vous devrez peut-être augmenter la taille de tempdb.

Utilisation d'opérations de copie en bloc basées sur le fichier

Le fournisseur OLE DB SQL Server Native Client implémente l'interface IBCPSession pour exposer la prise en charge des opérations de copie en bloc basées sur le fichier SQL Server. L'interface IBCPSession implémente les méthodes IBCPSession::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPDone, IBCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt et IBCPSession::BCPWriteFmt.

Pilote ODBC SQL Server Native Client

Le pilote ODBC SQL Server Native Client maintient la même prise en charge pour les opérations de copie en bloc qui faisaient partie des versions précédentes du pilote ODBC SQL Server. Pour plus d'informations sur l'exécution d'opérations de copie en bloc à l'aide du fournisseur OLE DB SQL Server Native Client, consultez Exécution d'opérations de copie en bloc (ODBC).

Historique des modifications

Mise à jour du contenu

Mise à jour du lien vers l'exemple.