Exécution d’opérations de copie en bloc dans SQL Server Native Client

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Important

SQL Server Native Client (souvent abrégé en SNAC) a été supprimé dans SQL Server 2022 (16.x) et SQL Server Management Studio 19 (SSMS). SQL Server Native Client (SQLNCLI ou SQLNCLI11) et le fournisseur Microsoft OLE DB pour SQL Server (SQLOLEDB) hérité ne sont pas recommandés dans les nouveaux développements. Utilisez à la place le nouveau Microsoft OLE DB Driver (MSOLEDBSQL) pour SQL Server ou le Microsoft ODBC Driver for SQL Server le plus récent. Pour SQLNCLI qui est fourni en tant que composant du moteur de base de données SQL Server (versions 2012 à 2019), consultez cette exception du cycle de vie du support.

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.

Pour obtenir un exemple d’application qui illustre cette fonctionnalité, consultez Copier des données en bloc avec IRowsetFastLoad (OLE DB).

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.

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 Importation et exportation en bloc de données (SQL Server).

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 avertit le fournisseur OLE DB SQL Server Native Client de sa nécessité de copier en bloc en définissant la propriété de source de données spécifique au fournisseur OLE DB SQL Server Native Client SSPROP_ENABLEFASTLOAD sur VARIANT_TRUE. Avec la propriété définie sur la source de données, le consommateur crée une session de fournisseur OLE DB SQL Server Native Client. La nouvelle session permet au consommateur d’accéder à l’interface IRowsetFastLoad.

Notes

Si l’interface IDataInitialize est utilisée pour initialiser la source de données, vous devez 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 pour les 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 prenant en charge la copie en bloc et provoquer la restauration de la session du fournisseur OLE DB SQL Server Native Client vers un traitement standard, réinitialisez SSPROP_ENABLEFASTLOAD sur VARIANT_FALSE.

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 prenant en charge 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ôler 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

R/W : Lecture/écriture

Tapez : 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 à 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

R/W : Lecture/écriture

Tapez : 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 de la colonne lorsque le consommateur du fournisseur OLE DB SQL Server Native Client insère une ligne contenant LA valeur 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

R/W : Lecture/écriture

Tapez : 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 (comme 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 la contention de verrou sur 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 de 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 : SQL Server utilise le contrôle de version de ligne pour les déclencheurs et stocke les versions des lignes dans le magasin de versions de la base de données 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 des fichiers SQL Server. L’interface IBCPSession implémente l’IBCPSession  ::BCPColFmt, IBCPSession ::BCPColumns, IBCPSession ::BCPControl, IBCPSession ::BCPDone, IBCPSession ::BCPExec, IBCPSession ::BCPInit, IBCPSession ::BCPReadFmt et IBCPSession ::BCPWriteFmt , méthodes.

Pilote ODBC SQL Server Native Client

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

Voir aussi

Fonctionnalités de SQL Server Native Client
Propriétés de la source de données (OLE DB)
Importation et exportation en bloc de données (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
Optimisation des performances de l’importation en bloc