Suporte a colunas esparsas no SQL Server Native Client

Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics Analytics Platform System (PDW)

Importante

O SQL Server Native Client (SNAC) não é fornecido com:

  • SQL Server 2022 (16.x) e versões posteriores
  • SQL Server Management Studio 19 e versões posteriores

O SQL Server Native Client (SQLNCLI ou SQLNCLI11) e o Microsoft OLE DB Provider for SQL Server (SQLOLEDB) herdados não são recomendados para o desenvolvimento de novos aplicativos.

Para novos projetos, use um dos seguintes drivers:

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 SQL Server Native Client oferece suporte a colunas esparsas. Para obter mais informações sobre colunas esparsas no SQL Server, confira Usar colunas esparsas e Usar conjuntos de colunas.

Para obter mais informações sobre o suporte a colunas esparsas no SQL Server Native Client, consulte Suporte a colunas esparsas (ODBC) e Suporte a colunas esparsas (OLE DB).

Cenários de usuário para colunas esparsas e o SQL Server Native Client

A tabela a seguir resume os cenários de usuário comuns para usuários do SQL Server Native Client com colunas esparsas:

Cenário Comportamento
select * from table ou IOpenRowset::OpenRowset. Retorna todas as colunas que não são membros do column_set esparso, além de uma coluna XML que contém os valores de todas as colunas não nulas que são membros do column_set esparso.
Referenciar uma coluna por nome. A coluna pode ser referenciada, independentemente de seu status de coluna esparsa ou associação ao column_set.
Acessar colunas de membro do column_set por meio de uma coluna XML computada. As colunas que são membros do column_set esparso podem ser acessadas selecionando o column_set por nome e podem ter valores inseridos e atualizados atualizando o XML na coluna column_set.

O valor precisa estar em conformidade com o esquema para colunas column_set.
Recuperar metadados para todas as colunas em uma tabela por meio de SQLColumns com um padrão de pesquisa de coluna de NULL ou '%' (ODBC); ou por meio do conjunto de linhas de esquema DBSCHEMA_COLUMNS sem restrição de coluna (OLE DB). Retorna uma linha para todas as colunas que não são membros de um column_set. Se a tabela tiver um column_set esparso, uma linha será retornada para ela.

Observe que isso não retorna os metadados para colunas que são membros de um column_set.
Recuperar metadados para todas as colunas, independentemente da dispersão ou da associação em um column_set. Essa ação pode retornar um número muito grande de linhas. Defina o campo de descritor SQL_SOPT_SS_NAME_SCOPE como SQL_SS_NAME_SCOPE_EXTENDED e chame SQLColumns (ODBC).

Chame IDBSchemaRowset::GetRowset para o conjunto de linhas de esquema DBSCHEMA_COLUMNS_EXTENDED (OLE DB).

Esse cenário não é possível em um aplicativo que usa o SQL Server Native Client de uma versão anterior ao SQL Server 2008 (10.0.x). No entanto, esse aplicativo pode consultar exibições do sistema diretamente.
Recuperar metadados somente para colunas que são membros de um column_set. Essa ação pode retornar um número muito grande de linhas. Defina o campo descritor SQL_SOPT_SS_NAME_SCOPE como SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET e chame SQLColumns (ODBC).

Chame IDBSchemaRowset::GetRowset para o conjunto de linhas de esquema DBSCHEMA_SPARSE_COLUMN_SET (OLE DB).

Esse cenário não é possível em um aplicativo que usa o SQL Server Native Client de uma versão anterior ao SQL Server 2008 (10.0.x). Entretanto, esse aplicativo poderia consultar exibições de sistema.
Determinar se uma coluna está esparsa. Consulte a coluna SS_IS_SPARSE do conjunto de resultados SQLColumns (ODBC).

Consulte a coluna SS_IS_SPARSE do conjunto de linhas de esquema de DBSCHEMA_COLUMNS (OLE DB).

Esse cenário não é possível em um aplicativo que usa o SQL Server Native Client de uma versão anterior ao SQL Server 2008 (10.0.x). Entretanto, esse aplicativo poderia consultar exibições de sistema.
Determinar se uma coluna é um column_set. Consulte a coluna SS_IS_COLUMN_SET do conjunto de resultados SQLColumns. Ou consulte o ODBC (SQL_CA_SS_IS_COLUMN_SET de atributos de coluna específico do SQL Server).

Consulte a coluna SS_IS_COLUMN_SET do conjunto de linhas de esquema de DBSCHEMA_COLUMNS. Ou então, confira dwFlags retornado por IColumnsinfo::GetColumnInfo ou DBCOLUMNFLAGS no conjunto de linhas retornado por IColumnsRowset::GetColumnsRowset. Para column_set colunas, DBCOLUMNFLAGS_SS_ISCOLUMNSET será definido (OLE DB).

Esse cenário não é possível em um aplicativo que usa o SQL Server Native Client de uma versão anterior ao SQL Server 2008 (10.0.x). Entretanto, esse aplicativo poderia consultar exibições de sistema.
Importar e exportar colunas esparsas por BCP para uma tabela sem column_set. Nenhuma alteração no comportamento das versões anteriores do SQL Server Native Client.
Importar e exportar colunas esparsas por BCP para uma tabela com um column_set. Se column_set estiver associado como um tipo binário, ele será importado e exportado da mesma maneira que o XML; ou seja, como varbinary(max) . Se estiver associado como um tipo char ou wchar, será importado como nvarchar (max) .

As colunas que são membros do column_set esparso não são exportadas como colunas distintas; elas só são exportadas no valor do column_set.
Comportamento de queryout para BCP. Nenhuma alteração no tratamento de colunas nomeadas explicitamente de versões anteriores do SQL Server Native Client.

Cenários que envolvem importação e exportação entre tabelas com esquemas diferentes podem exigir manipulação especial.

Para obter mais informações sobre BCP, consulte Suporte de BCP (cópia em massa) a colunas esparsas, mais adiante neste tópico.

Comportamento do cliente de versão anterior

Os clientes de nível inferior só retornarão metadados para colunas que não são membros do column_set esparso para SQLColumns e DBSCHMA_COLUMNS. Os conjuntos de linhas de esquema OLE DB adicionais introduzidos no SQL Server 2008 (10.0.x) Native Client não estarão disponíveis, nem as modificações no SQLColumns no ODBC por meio do SQL_SOPT_SS_NAME_SCOPE.

Os clientes de nível inferior podem acessar as colunas que são membros do column_set esparso por nome, e a coluna column_set ficará acessível como uma coluna XML aos clientes do SQL Server 2005 (9.x).

Suporte de BCP (cópia em massa) a colunas esparsas

Não há alterações na API BCP no ODBC ou no OLE DB para as colunas esparsas ou column_set recursos.

Se uma tabela tiver um column_set, as colunas esparsas não serão tratadas como colunas distintas. Os valores de todas as colunas esparsas serão incluídos no valor do column_set, que é exportado da mesma maneira que uma coluna XML, ou seja, como varbinary(max) , se estiver associado como tipo binário ou como nvarchar(max) se estiver associado como tipo char or wchar). Na importação, o valor de column_set precisa estar em conformidade com o esquema do column_set.

Para operações queryout, não há alterações na maneira como são tratadas as colunas referenciadas explicitamente. As colunas de column_set têm o mesmo comportamento das colunas XML e a dispersão não tem nenhum efeito sobre o tratamento de colunas esparsas nomeadas.

Entretanto, se queryout for usado para exportação e você referenciar colunas esparsas que são membros do conjunto de colunas esparsas por nome, você não poderá executar uma importação direta para uma tabela de estrutura semelhante. Isso acontece porque o BCP usa metadados de maneira consistente com uma operação select * para a importação e não consegue corresponder as colunas de membro column_set a esses metadados. Para importar as colunas de membro de column_set individualmente, você precisa definir uma exibição na tabela que referencia as colunas do column_set desejadas, além de executar a operação de importação usando a exibição.

Confira também

Programação do SQL Server Native Client