Compartilhar via


Cópia em massa de variáveis do programa

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure PDW (Sistema de Plataforma de Análise) do Azure Synapse Analytics

Você pode fazer cópias em massa diretamente de variáveis de programa. Depois de alocar variáveis para manter os dados de uma linha e chamar bcp_init para iniciar a cópia em massa, chame bcp_bind para cada coluna para especificar o local e o formato da variável de programa a ser associada à coluna. Preencha cada variável com dados e chame bcp_sendrow para enviar uma linha de dados ao servidor. Repita o processo de preenchimento das variáveis e chame bcp_sendrow até que todas as linhas tenham sido enviadas ao servidor e, em seguida, chame bcp_done para especificar que a operação foi concluída.

O parâmetro pData bcp_bindcontém o endereço da variável que está sendo associada à coluna. Os dados de cada coluna podem ser armazenados de uma destas duas formas:

  • Aloque uma variável para manter os dados.

  • Aloque uma variável de indicador seguida imediatamente pela variável de dados.

A variável de indicador indica o comprimento dos dados para colunas de comprimento variável e também indica valores NULL se a coluna permitir NULLs. Se apenas uma variável de dados for usada, o endereço dessa variável será armazenado no parâmetro pData bcp_bind. Se uma variável indicadora for usada, o endereço da variável indicadora será armazenado no parâmetro bcp_bindpData . As funções de cópia em massa calculam o local da variável de dados adicionando os parâmetros bcp_bindcbIndicator e pData.

bcp_bind oferece suporte a três métodos para lidar com dados de comprimento variável:

  • Use cbData com apenas uma variável de dados. Coloque o comprimento dos dados em cbData. Cada vez que o comprimento dos dados a serem copiados em massa for alterado, chame bcp_collen para redefinir cbData. Se um dos outros dois métodos estiver sendo usado, especifique SQL_VARLEN_DATA para cbData. Se todos os valores de dados fornecidos para uma coluna forem NULL, especifique SQL_NULL_DATA para cbData.

  • Use variáveis de indicador. Como cada valor de dados novo é movido na variável de dados, armazene o comprimento do valor na variável de indicador. Se um dos outros dois métodos estiver sendo usado, especifique 0 para cbIndicator.

  • Use ponteiros de terminador. Carregue o parâmetro pTerm bcp_bindcom o endereço do padrão de bits que encerra os dados. Se um dos outros dois métodos estiver sendo usado, especifique NULL para pTerm.

Todos esses três métodos podem ser usados na mesma chamada bcp_bind , caso em que a especificação que resulta na menor quantidade de dados sendo copiados é usada.

O parâmetro de tipo bcp_bindusa identificadores de tipo de dados DB-Library, não identificadores de tipo de dados ODBC. Os identificadores de tipo de dados da biblioteca de banco de dados são definidos em sqlncli.h para uso com a função ODBC bcp_bind .

As funções de cópia em massa não têm suporte para todos os tipos de dados do ODBC C. Por exemplo, as funções de cópia em massa não dão suporte à estrutura de SQL_C_TYPE_TIMESTAMP ODBC, portanto, use SQLBindCol ou SQLGetData para converter dados de SQL_TYPE_TIMESTAMP ODBC em uma variável SQL_C_CHAR. Se você usar bcp_bind com um parâmetro de tipo SQLCHARACTER para associar a variável a uma coluna datetime do SQL Server, as funções de cópia em massa converterão a cláusula de escape de carimbo de data/hora na variável de caractere para o formato datetime adequado.

A tabela a seguir lista os tipos de dados recomendados a serem usados no mapeamento de um tipo de dados SQL ODBC para um tipo de dados SQL Server.

Tipo de dados do ODBC SQLz Tipos de dados do ODBC C bcp_bind parâmetro de tipo Tipo de dados do SQL Server
SQL_CHAR SQL_C_CHAR SQLCHARACTER character

char
SQL_VARCHAR SQL_C_CHAR SQLCHARACTER varchar

character varying

char varying

sysname
SQL_LONGVARCHAR SQL_C_CHAR SQLCHARACTER text
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 (assinado) SQL_C_SSHORT SQLINT2 smallint
SQL_TINYINT (sem-sinal) SQL_C_UTINYINT SQLINT1 tinyint
SQL_SMALL_INT (assinado) SQL_C_SSHORT SQLINT2 smallint
SQL_SMALL_INT (sem-sinal) SQL_C_SLONG SQLINT4 int

inteiro
SQL_INTEGER (assinado) SQL_C_SLONG SQLINT4 int

inteiro
SQL_INTEGER (não assinado) SQL_C_CHAR SQLCHARACTER decimal

dec
SQL_BIGINT (assinado e sem-sinal) 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

variação binária
SQL_LONGVARBINARY SQL_C_BINARY SQLBINARY imagem
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

O SQL Server não tem tipos de dados tinyint assinados, smallint não assinados ou int não assinados. Para evitar a perda de valores de dados ao migrar esses tipos de dados, crie a tabela do SQL Server com o próximo maior tipo de dados inteiro. Para impedir que os usuários adicionem posteriormente valores fora do intervalo permitido pelo tipo de dados original, aplique uma regra à coluna SQL Server para restringir os valores permitidos ao intervalo com suporte pelo tipo de dados na fonte original:

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  

O SQL Server não oferece suporte direto a tipos de dados de intervalo. No entanto, um aplicativo pode armazenar sequências de escape de intervalo como cadeias de caracteres em uma coluna de caracteres do SQL Server. O aplicativo pode lê-los para uso posterior, mas eles não podem ser usados em instruções Transact-SQL.

As funções de cópia em massa podem ser usadas para carregar rapidamente dados no SQL Server que foram lidos de uma fonte de dados ODBC. Use SQLBindCol para associar as colunas de um conjunto de resultados a variáveis de programa e, em seguida, use bcp_bind para associar as mesmas variáveis de programa a uma operação de cópia em massa. Chamar SQLFetchScroll ou SQLFetch busca uma linha de dados da fonte de dados ODBC para as variáveis de programa e chamar bcp_sendrow copia em massa os dados das variáveis de programa para o SQL Server.

Um aplicativo pode usar a função bcp_colptr sempre que precisar alterar o endereço da variável de dados originalmente especificada no parâmetro pData bcp_bind. Um aplicativo pode usar a função bcp_collen sempre que precisar alterar o comprimento dos dados originalmente especificado no parâmetro bcp_bindcbData.

Você não pode ler dados do SQL Server em variáveis de programa usando cópia em massa; Não há nada como uma função "bcp_readrow". Você só pode enviar dados do aplicativo para o servidor.

Confira também

Executando operações de cópia em massa (ODBC)