Executando operações de cópia em massa no SQL Server Native Client

Aplica-se a:SQL ServerBanco de Dados SQL do AzureInstância Gerenciada de SQL do AzureAzure Synapse AnalyticsPDW (Analytics Platform System)

Importante

O SQL Server Native Client (geralmente abreviado como SNAC) foi removido do SQL Server 2022 (16.x) e do SSMS (SQL Server Management Studio) 19. O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Provedor OLE DB herdado da Microsoft para o SQL Server (SQLOLEDB) não são recomendados para um novo desenvolvimento de aplicativo. Alterne para o novo Driver do Microsoft OLE DB para SQL Server (MSOLEDBSQL) ou o Microsoft ODBC Driver for SQL Server mais recente no futuro. Para SQLNCLI que é fornecido como um componente do Mecanismo de Banco de Dados do SQL Server (versões 2012 a 2019), confira esta exceção de Ciclo de Vida de Suporte.

O recurso de cópia em massa do SQL Server suporta a transferência de grandes quantidades de dados de ou para uma tabela ou exibição do SQL Server. Os dados também podem ser transferidos com a especificação de uma instrução SELECT. É possível mover os dados entre o SQL Server e um arquivo de dados do sistema operacional, como um arquivo ASCII. O arquivo de dados pode ter diferentes formatos; o formato é definido para que a cópia em massa seja feita em um arquivo de formato. Como alternativa, os dados podem ser carregados para variáveis de programa e podem ser transferidos para o SQL Server usando funções e métodos de cópia em massa.

Para obter um aplicativo de exemplo que demonstra esse recurso, confira Copiar dados em massa usando IRowsetFastLoad (OLE DB).

Normalmente, um aplicativo usa o recurso de cópia em massa de uma destas maneiras:

  • Faz cópia em massa a partir de uma tabela, exibição ou conjunto de resultados de uma instrução Transact-SQL para um arquivo de dados onde os dados são armazenados no mesmo formato que a tabela ou exibição.

    Esse arquivo é chamado de arquivo de dados de modo nativo.

  • Faz cópia em massa a partir de uma tabela, exibição ou conjunto de resultados de uma instrução Transact-SQL para um arquivo de dados onde os dados são armazenados em um formato diferente do formato da tabela ou exibição.

    Nesse caso, um arquivo de formato separado é criado para definir as características (tipo de dados, posição, comprimento, terminador, e assim por diante) de cada coluna à medida que ela é armazenada no arquivo de dados. Se todas as colunas forem convertidas em um formato de caractere, o arquivo resultante será chamado de arquivo de dados do modo de caractere.

  • Faz cópia em massa a partir de um arquivo de dados para uma tabela ou exibição.

    Se necessário, um arquivo de formato é usado para determinar o layout do arquivo de dados.

  • Faz o carregamento de dados para variáveis de programa e importa os dados para uma tabela ou exibição usando as funções de cópia em massa para executar a cópia em massa em uma linha de cada vez.

Os arquivos de dados usados pelas funções de cópia em massa não precisam ser criados por outro programa de cópia em massa. Qualquer outro sistema pode gerar um arquivo de dados e um arquivo de formato para executar a cópia em massa de definições; esses arquivos podem ser usados com um programa de cópia em massa do SQL Server para importar dados para o SQL Server. Por exemplo, você poderia exportar dados de uma planilha em um arquivo delimitado por tabulação, criar um arquivo de formato descrevendo o arquivo delimitado por tabulação e usar um programa de cópia em massa para importar rapidamente os dados para o SQL Server. Os arquivos de dados gerados pela cópia em massa também podem ser importados para outros aplicativos. Por exemplo, você poderia usar as funções de cópia em massa para exportar dados de uma tabela ou exibição para um arquivo delimitado por tabulação que poderia, por sua vez, ser carregado para a planilha.

Os aplicativos de codificação para programadores que usam funções de cópia em massa deveriam seguir as regras gerais para garantir o bom desempenho dessas funções. Para obter mais informações sobre o suporte a operações de carregamento em massa em SQL Server, confira Importação e exportação de dados em massa (SQL Server).

Limitações e Restrições

Um UDT (tipo definido pelo usuário) CLR deve ser associado como dados binários. Mesmo se um arquivo de formato especificar SQLCHAR como o tipo de dados para uma coluna UDT de destino, o utilitário BCP interpretará os dados como binários.

Não use SET FMTONLY OFF com operações de cópia em massa. SET FMTONLY OFF pode fazer sua operação de cópia em massa falhar ou gerar resultados inesperados.

Provedor OLE DB do SQL Server Native Client

O provedor OLE DB do SQL Server Native Client implementa dois métodos para executar operações de cópia em massa com um banco de dados do SQL Server. O primeiro método envolve o uso da interface IRowsetFastLoad para operações de cópia em massa baseadas em memória; o segundo envolve o uso da interface IBCPSession para operações de cópia em massa baseadas em arquivo.

Usando operações de cópia em massa baseadas em memória

O provedor OLE DB do SQL Server Native Client implementa a interface IRowsetFastLoad para expor o suporte para operações de cópia em massa baseadas em memória do SQL Server. A interface IRowsetFastLoad implementa os métodos IRowsetFastLoad::Commit e IRowsetFastLoad::InsertRow.

Habilitando uma sessão para IRowsetFastLoad

O consumidor notifica o provedor OLE DB do SQL Server Native Client sobre sua necessidade de cópia em massa definindo a propriedade de fonte de dados específica do provedor OLE DB do SQL Server Native Client SSPROP_ENABLEFASTLOAD como VARIANT_TRUE. Com a propriedade definida na fonte de dados, o consumidor cria uma sessão do provedor OLE DB do SQL Server Native Client. A nova sessão permite que o consumidor acesse a interface IRowsetFastLoad.

Observação

Se a interface IDataInitialize for usada para inicializar a fonte de dados, será necessário definir a propriedade SSPROP_IRowsetFastLoad no parâmetro rgPropertySets do método IOpenRowset::OpenRowset; caso contrário, a chamada ao método OpenRowset retornará E_NOINTERFACE.

Habilitar uma sessão para cópia em massa restringe o suporte do provedor OLE DB do SQL Server Native Client para interfaces na sessão. Uma sessão habilitada para cópia em massa expõe apenas as seguintes interfaces:

  • IDBSchemaRowset

  • IGetDataSource

  • IOpenRowset

  • ISupportErrorInfo

  • ITransactionJoin

Para desabilitar a criação de conjuntos de linhas habilitados para cópia em massa e fazer com que a sessão do provedor OLE DB do SQL Server Native Client reverta para o processamento padrão, redefina SSPROP_ENABLEFASTLOAD para VARIANT_FALSE.

Conjuntos de linhas IRowsetFastLoad

Os conjuntos de linhas de cópia em massa do provedor OLE DB do SQL Server Native Client são somente gravação, mas expõem interfaces que permitem ao consumidor determinar a estrutura de uma tabela do SQL Server. As interfaces a seguir são expostas em um conjunto de linhas do provedor OLE DB do SQL Server Native Client habilitado para cópia em massa:

  • IAccessor

  • IColumnsInfo

  • IColumnsRowset

  • IConvertType

  • IRowsetFastLoad

  • IRowsetInfo

  • ISupportErrorInfo

As propriedades específicas do provedor SSPROP_FASTLOADOPTIONS, SSPROP_FASTLOADKEEPNULLS e SSPROP_FASTLOADKEEPIDENTITY comportamentos de controle de um conjunto de linhas de cópia em massa do provedor OLE DB do SQL Server Native Client. As propriedades são especificadas no membro rgProperties de um membro do parâmetro rgPropertySetsIOpenRowset.

ID da propriedade Descrição
SSPROP_FASTLOADKEEPIDENTITY Coluna: Não

L/G: Leitura/gravação

Tipo: VT_BOOL

Padrão: VARIANT_FALSE

Descrição: Mantém valores de identidade fornecidos pelo consumidor.

VARIANT_FALSE: Valores para uma coluna de identidade na tabela SQL Server são gerados pelo SQL Server. Qualquer valor associado à coluna é ignorado pelo provedor OLE DB do SQL Server Native Client.

VARIANT_TRUE: O consumidor associa um acessador fornecendo um valor para uma coluna de identidade SQL Server. A propriedade de identidade não está disponível em colunas que aceitam valores NULL e, portanto, o consumidor fornece um valor exclusivo em cada chamada a IRowsetFastLoad::Insert.
SSPROP_FASTLOADKEEPNULLS Coluna: Não

L/G: Leitura/gravação

Tipo: VT_BOOL

Padrão: VARIANT_FALSE

Descrição: Mantém valores NULL para colunas com uma restrição DEFAULT. Só afeta colunas SQL Server que aceitam valores NULL e que têm uma restrição DEFAULT aplicada.

VARIANT_FALSE: O SQL Server insere o valor padrão para a coluna quando o consumidor do provedor OLE DB do SQL Server Native Client insere uma linha contendo NULL para a coluna.

VARIANT_TRUE: O SQL Server insere NULL para o valor da coluna quando o consumidor do provedor OLE DB do SQL Server Native Client insere uma linha contendo NULL para a coluna.
SSPROP_FASTLOADOPTIONS Coluna: Não

L/G: Leitura/gravação

Tipo: VT_BSTR

Padrão: nenhum

Descrição: Esta propriedade é a mesma que a opção -h "hint[,...n]" do utilitário bcp. A cadeia de caracteres a seguir pode ser usada como opção na cópia em massa de dados para uma tabela.

ORDER(column[ASC | DESC][,...n]): Ordem de classificação dos dados no arquivo de dados. O desempenho da operação de cópia em massa é aprimorado se o arquivo de dados que está sendo carregado for classificado de acordo com o índice clusterizado na tabela.

ROWS_PER_BATCH = bb: Número de linhas de dados por lote (como bb). O servidor otimiza o carregamento em massa de acordo com o valor bb. Por padrão, ROWS_PER_BATCH é desconhecido.

KILOBYTES_PER_BATCH = cc: Número de kilobytes (KB) de dados por lote (como cc). Por padrão, KILOBYTES_PER_BATCH é desconhecido.

TABLOCK: Um bloqueio em nível de tabela é obtido enquanto durar a operação de cópia em massa. Essa opção melhora significativamente o desempenho porque manter um bloqueio apenas durante a operação de cópia em massa reduz a contenção de bloqueios na tabela. Uma tabela pode ser carregada simultaneamente por vários clientes se ela não tem índices e se TABLOCK está especificado. Por padrão, o comportamento de bloqueio é determinado pela opção de tabela table lock on bulk load.

CHECK_CONSTRAINTS: Todas as restrições em table_name são verificadas durante a operação de cópia em massa. Por padrão, as restrições são ignoradas.

FIRE_TRIGGER: o SQL Server usa o controle de versão de linha para gatilhos e armazena as versões de linha no repositório de versões em tempdb. Portanto, as otimizações de registro em massa estão disponíveis até mesmo quando os gatilhos estão habilitados. Antes de iniciar a importação em massa de um lote com um número grande de linhas com gatilhos habilitados, talvez você precise expandir o tamanho do tempdb.

Usando operações de cópia em massa baseadas em arquivo

O provedor OLE DB do SQL Server Native Client implementa a interface IBCPSession para expor o suporte a operações de cópia em massa baseadas em arquivo do SQL Server. A interface IBCPSession::BCPColFmt, IBCPSession::BCPColumns, IBCPSession::BCPControl, IBCPSession::BCPDone, IBCPSession::BCPExec, IBCPSession::BCPInit, IBCPSession::BCPReadFmt e IBCPSession::BCPWriteFmt.

Driver ODBC do SQL Server Native Client

O driver ODBC do SQL Server Native Client mantém o mesmo suporte para operações de cópia em massa que faziam parte de versões anteriores do driver ODBC do SQL Server. Para obter informações sobre operações de cópia em massa usando o driver ODBC do SQL Server Native Client, consulte Executando operações de cópia em massa (ODBC).

Confira também

Recursos do SQL Server Native Client
Propriedades da fonte de dados (OLE DB)
Importação e exportação em massa de dados (SQL Server)
IRowsetFastLoad (OLE DB)
IBCPSession (OLE DB)
Otimizando o desempenho da importação em massa