Copie en bloc à partir de variables de programme

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

Vous pouvez effectuer une copie en bloc directement à partir de variables de programme. Après avoir alloué des variables pour contenir les données d’une ligne et appeler bcp_init pour démarrer la copie en bloc, appelez bcp_bind pour chaque colonne afin de spécifier l’emplacement et le format de la variable de programme à associer à la colonne. Remplissez chaque variable avec des données, puis appelez bcp_sendrow pour envoyer une ligne de données au serveur. Répétez le processus de remplissage des variables et d’appel bcp_sendrow jusqu’à ce que toutes les lignes aient été envoyées au serveur, puis appelez bcp_done pour spécifier que l’opération est terminée.

Le paramètre pData bcp_bindcontient l’adresse de la variable liée à la colonne. Les données de chaque colonne peuvent être stockées de l'une des deux manières suivantes :

  • Allocation d'une variable destinée à contenir les données.

  • Allocation d'une variable indicateur suivie immédiatement de la variable de données.

La variable indicateur indique la longueur des données des colonnes de longueur variable et indique des valeurs NULL si la colonne autorise ces valeurs. Si seule une variable de données est utilisée, l’adresse de cette variable est stockée dans le paramètre pData bcp_bind. Si une variable d’indicateur est utilisée, l’adresse de la variable d’indicateur est stockée dans le paramètre pData bcp_bind. Les fonctions de copie en bloc calculent l’emplacement de la variable de données en ajoutant les paramètres cbIndicator et pData bcp_bind.

bcp_bind prend en charge trois méthodes pour traiter les données de longueur variable :

  • Utilisez cbData uniquement avec une variable de données. Placez la longueur des données dans cbData. Chaque fois que la durée des données à copier en bloc, appelez bcp_collen pour réinitialiser cbData. Si l’une des deux autres méthodes est utilisée, spécifiez SQL_VARLEN_DATA pour cbData. Si toutes les valeurs de données fournies pour une colonne sont NULL, spécifiez SQL_NULL_DATA pour cbData.

  • Utilisation de variables indicateur. Dès qu'une nouvelle valeur de données est déplacée dans la variable de données, stockez la longueur de la valeur dans la variable indicateur. Si l’une des deux autres méthodes est utilisée, spécifiez 0 pour cbIndicator.

  • Utilisation de pointeurs de terminateur. Chargez le paramètre pTerm bcp_bindavec l’adresse du modèle de bits qui met fin aux données. Si l’une des deux autres méthodes est utilisée, spécifiez NULL pour pTerm.

Ces trois méthodes peuvent être utilisées sur le même appel bcp_bind , auquel cas la spécification qui entraîne la plus petite quantité de données copiées est utilisée.

Le paramètre de type bcp_bindutilise des identificateurs de type de données db-Library, et non des identificateurs de type de données ODBC. Les identificateurs de type de données de la bibliothèque de bases de données sont définis dans sqlncli.h pour une utilisation avec la fonction bcp_bind ODBC.

Les fonctions de copie en bloc ne prennent pas en charge tous les types de données ODBC C. Par exemple, les fonctions de copie en bloc ne prennent pas en charge la structure de SQL_C_TYPE_TIMESTAMP ODBC. Utilisez donc SQLBindCol ou SQLGetData pour convertir des données ODBC SQL_TYPE_TIMESTAMP en variable SQL_C_CHAR. Si vous utilisez ensuite bcp_bind avec un paramètre de type SQLCHARACTER pour lier la variable à une colonne datetime SQL Server, les fonctions de copie en bloc convertissent la clause d’échappement timestamp dans la variable de caractère au format datetime approprié.

Le tableau suivant répertorie les types de données recommandés à utiliser dans le mappage d’un type de données ODBC SQL à un type de données SQL Server.

Type de données ODBC SQL Type de données ODBC C paramètre de type bcp_bind Type de données SQL Server
SQL_CHAR SQL_C_CHAR SQLCHARACTER character

char
SQL_VARCHAR SQL_C_CHAR SQLCHARACTER varchar

caractère variable

char varying

sysname
SQL_LONGVARCHAR SQL_C_CHAR SQLCHARACTER texte
SQL_WCHAR SQL_C_WCHAR SQLNCHAR nchar
SQL_WVARCHAR SQL_C_WCHAR SQLNVARCHAR nvarchar
SQL_WLONGVARCHAR SQL_C_WCHAR SQLNTEXT ntext
SQL_DECIMAL SQL_C_CHAR SQLCHARACTER decimal

dec

money

smallmoney
SQL_NUMERIC SQL_C_NUMERIC SQLNUMERICN Numérique
SQL_BIT SQL_C_BIT SQLBIT bit
SQL_TINYINT (signé) SQL_C_SSHORT SQLINT2 smallint
SQL_TINYINT (non signé) SQL_C_UTINYINT SQLINT1 tinyint
SQL_SMALL_INT (signé) SQL_C_SSHORT SQLINT2 smallint
SQL_SMALL_INT (non signé) SQL_C_SLONG SQLINT4 int

entier
SQL_INTEGER (signé) SQL_C_SLONG SQLINT4 int

entier
SQL_INTEGER (non signé) SQL_C_CHAR SQLCHARACTER decimal

dec
SQL_BIGINT (signé et non signé) SQL_C_CHAR SQLCHARACTER bigint
SQL_REAL SQL_C_FLOAT SQLFLT4 real
SQL_FLOAT SQL_C_DOUBLE SQLFLT8 float
SQL_DOUBLE SQL_C_DOUBLE SQLFLT8 float
SQL_BINARY SQL_C_BINARY SQLBINARY binary

timestamp
SQL_VARBINARY SQL_C_BINARY SQLBINARY varbinary

binary varying
SQL_LONGVARBINARY SQL_C_BINARY SQLBINARY image
SQL_TYPE_DATE SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIME SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_TYPE_TIMESTAMP SQL_C_CHAR SQLCHARACTER datetime

smalldatetime
SQL_GUID SQL_C_GUID SQLUNIQUEID uniqueidentifier
SQL_INTERVAL_ SQL_C_CHAR SQLCHARACTER char

SQL Server n’a pas signé tinyint, smallint non signé ou des types de données int non signés. Pour éviter la perte de valeurs de données lors de la migration de ces types de données, créez la table SQL Server avec le plus grand type de données entier suivant. Pour empêcher les utilisateurs d’ajouter ultérieurement des valeurs en dehors de la plage autorisée par le type de données d’origine, appliquez une règle à la colonne SQL Server pour restreindre les valeurs autorisées à la plage prise en charge par le type de données dans la source d’origine :

CREATE TABLE Sample_Ints(STinyIntCol   SMALLINT,  
USmallIntCol INT)  
GO  
CREATE RULE STinyInt_Rule  
AS   
@range >= -128 AND @range <= 127  
GO  
CREATE RULE USmallInt_Rule  
AS   
@range >= 0 AND @range <= 65535  
GO  
sp_bindrule STinyInt_Rule, 'Sample_Ints.STinyIntCol'  
GO  
sp_bindrule USmallInt_Rule, 'Sample_Ints.USmallIntCol'  
GO  

SQL Server ne prend pas en charge les types de données d’intervalle directement. Toutefois, une application peut stocker des séquences d’échappement d’intervalle sous forme de chaînes de caractères dans une colonne de caractères SQL Server. L’application peut les lire pour une utilisation ultérieure, mais elle ne peut pas être utilisée dans les instructions Transact-SQL.

Les fonctions de copie en bloc peuvent être utilisées pour charger rapidement des données dans SQL Server qui ont été lues à partir d’une source de données ODBC. Utilisez SQLBindCol pour lier les colonnes d’un jeu de résultats aux variables de programme, puis utilisez bcp_bind pour lier les mêmes variables de programme à une opération de copie en bloc. L’appel de SQLFetchScroll ou SQLFetch extrait ensuite une ligne de données de la source de données ODBC dans les variables de programme et appelle bcp_sendrow copie en bloc les données des variables de programme vers SQL Server.

Une application peut utiliser la fonction bcp_colptr chaque fois qu’elle doit modifier l’adresse de la variable de données spécifiée à l’origine dans le paramètre pData bcp_bind. Une application peut utiliser la fonction bcp_collen chaque fois qu’elle doit modifier la longueur des données spécifiée à l’origine dans le paramètre cbData bcp_bind.

Vous ne pouvez pas lire les données de SQL Server dans des variables de programme à l’aide d’une copie en bloc ; il n’y a rien comme une fonction « bcp_readrow ». Vous pouvez seulement envoyer des données de l'application au serveur.

Voir aussi

Exécution d’opérations de copie en bloc (ODBC)