Copie en bloc à partir de variables de programme
S’applique à : SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics 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 | numeric |
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.