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.