Cópia em massa a partir de variáveis de programa

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse Analytics

Podes copiar em massa diretamente das variáveis do programa. Depois de alocar variáveis para armazenar os dados por uma linha e chamar bcp_init para iniciar a cópia em massa, chama bcp_bind para cada coluna para especificar a localização e o formato da variável do programa a associar à coluna. Preenche cada variável com dados e depois chama-bcp_sendrow para enviar uma linha de dados ao servidor. Repita o processo de preencher as variáveis e chamar bcp_sendrow até que todas as linhas tenham sido enviadas para o servidor, depois chame-bcp_done para especificar que a operação está concluída.

O parâmetro bcp_bindpData contém o endereço da variável a ser associada à coluna. Os dados de cada coluna podem ser armazenados de duas formas:

  • Aloque uma variável para armazenar os dados.

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

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

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

  • Usa o cbData apenas com uma variável de dados. Coloque o comprimento dos dados no cbData. Cada vez que o comprimento dos dados a copiar em massa muda, ligue para bcp_collen para reiniciar o cbData. Se estiver a ser usado um dos outros dois métodos, especifique SQL_VARLEN_DATA para o cbData. Se todos os valores de dados fornecidos para uma coluna forem NULL, especifique SQL_NULL_DATA para cbData.

  • Usa variáveis indicadoras. À medida que cada novo valor de dados é movido para a variável de dados, armazene o comprimento do valor na variável indicadora. Se estiver a ser usado um dos outros dois métodos, especifique 0 para cbIndicator.

  • Usa ponteiros terminator. Carregue o parâmetro bcp_bindpTerm com o endereço do padrão de bits que termina os dados. Se estiver a ser usado um dos outros dois métodos, especifique NULL para pTerm.

Todos estes três métodos podem ser usados na mesma chamada bcp_bind , caso em que se utiliza a especificação que resulta na menor quantidade de dados a ser copiada.

O parâmetro de tipo bcp_bind utiliza identificadores de tipo de dados DB-Library, não identificadores ODBC. DB-Library identificadores de tipos de dados são definidos em sqlncli.h para utilização com a função bcp_bind ODBC.

As funções de cópia em massa não suportam todos os tipos de dados ODBC C. Por exemplo, as funções de cópia em massa não suportam a estrutura de SQL_C_TYPE_TIMESTAMP ODBC, por isso use SQLBindCol ou SQLGetData para converter dados de SQL_TYPE_TIMESTAMP ODBC numa variável SQL_C_CHAR. Se depois usar bcp_bind com um parâmetro de tipo SQLCHARACTER para ligar a variável a uma coluna de data-hora SQL Server, as funções de cópia em massa convertem a cláusula de escape de carimbo temporal na variável de carácter para o formato de data-hora correto.

A tabela seguinte lista os tipos de dados recomendados a usar no mapeamento de um tipo de dado ODBC SQL para um tipo de dado SQL Server.

Tipo ODBC SQLdata Tipo de dados 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

Carácter variável

Variação do carvão

sysname
SQL_LONGVARCHAR SQL_C_CHAR SQLCHARACTER texto
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 (não assinado) SQL_C_UTINYINT SQLINT1 tinyint
SQL_SMALL_INT (assinado) SQL_C_SSHORT SQLINT2 smallint
SQL_SMALL_INT (não assinado) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER (assinado) SQL_C_SLONG SQLINT4 int

integer
SQL_INTEGER (não assinado) SQL_C_CHAR SQLCHARACTER decimal

dec
SQL_BIGINT (assinado e não assinado) 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 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

O SQL Server não tem tipos de dados signed tinyint, unsigned smallint ou unsigned int. Para evitar a perda de valores de dados ao migrar estes tipos de dados, crie a tabela SQL Server com o próximo maior tipo de dado inteiro. Para evitar que os utilizadores adicionem mais tarde valores fora do intervalo permitido pelo tipo de dado original, aplique uma regra à coluna do SQL Server para restringir os valores permitidos ao intervalo suportado pelo tipo de dado 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 suporta diretamente tipos de dados de intervalo. No entanto, uma aplicação pode armazenar sequências de escape de intervalos como cadeias de caracteres numa coluna de caracteres do SQL Server. A aplicação pode lê-los para uso posterior, mas 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 a partir de uma fonte de dados ODBC. Use o SQLBindCol para associar as colunas de um conjunto de resultados a variáveis de programação, depois use bcp_bind para associar as mesmas variáveis de programa a uma operação de cópia em massa. Chamar SQLFetchScroll ou SQLFetch obtém então uma linha de dados da fonte de dados ODBC para as variáveis do programa, e chamar bcp_sendrow bulk copia os dados das variáveis do programa para SQL Server .

Uma aplicação pode usar a função bcp_colptr sempre que precisar de alterar o endereço da variável de dados originalmente especificada no parâmetro bcp_bindpData . Uma aplicação pode usar a função bcp_collen sempre que precisar de alterar o comprimento de dados originalmente especificado no parâmetro bcp_bindcbData .

Não pode ler dados de SQL Server em variáveis de programa usando cópia em massa; não existe nada como uma função "bcp_readrow". Só pode enviar dados da aplicação para o servidor.