Compatibilidad con columnas dispersas en SQL Server Native Client
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
Importante
SQL Server Native Client (SNAC) no se incluye con:
- SQL Server 2022 (16.x) y versiones posteriores
- SQL Server Management Studio 19 y versiones posteriores
Sql Server Native Client (SQLNCLI o SQLNCLI11) y el proveedor MICROSOFT OLE DB heredado para SQL Server (SQLOLEDB) no se recomiendan para el desarrollo de aplicaciones nuevas.
En el caso de los proyectos nuevos, use uno de los siguientes controladores:
Para SQLNCLI que se incluye como componente de motor de base de datos de SQL Server (versiones 2012 a 2019), consulte esta excepción de ciclo de vida de soporte técnico.
SQL Server Native Client admite columnas dispersas. Para más información sobre columnas dispersas en SQL Server, consulte Usar columnas dispersas y Usar conjuntos de columnas.
Para obtener más información sobre la compatibilidad con columnas dispersas en SQL Server Native Client, vea Compatibilidad con columnas dispersas (ODBC) y Compatibilidad con columnas dispersas (OLE DB).
Escenarios de usuarios de columnas dispersas y SQL Server Native Client
En la tabla siguiente se resumen los escenarios de usuario comunes para los usuarios de SQL Server Native Client con columnas dispersas:
Escenario | Comportamiento |
---|---|
select * from table or IOpenRowset::OpenRowset. | Devuelve todas las columnas que no son miembros del column_set disperso, más una columna XML que contiene los valores de todas las columnas no nulas que son miembros del column_set disperso. |
Hacer referencia a una columna por nombre. | Se puede hacer referencia a la columna independientemente de su estado de columna dispersa o la pertenencia al column_set. |
Obtener acceso a las columnas miembro del column_set a través de una columna XML calculada. | Se puede acceder a las columnas que son miembros del column_set disperso al seleccionar el column_set por nombre y se puede hacer que se inserten y actualicen los valores al actualizar el XML de la columna column_set. El valor debe cumplir el esquema de las columnas column_set. |
Recuperar metadatos para todas las columnas de una tabla a través de SQLColumns con un patrón de búsqueda de columnas de NULL o '%' (ODBC); o a través del conjunto de filas de esquema DBSCHEMA_COLUMNS sin ninguna restricción de columna (OLE DB). | Devuelve una fila para todas las columnas que no son miembros del column_set. Si la tabla tiene un column_set disperso, se devolverá una fila. Observe que esto no devuelve los metadatos de las columnas que son miembros del column_set. |
Recuperar los metadatos de todas las columnas, independientemente de la dispersión o pertenencia en un column_set. Esto podría devolver un número muy grande de filas. | Establezca el campo descriptor SQL_SOPT_SS_NAME_SCOPE en SQL_SS_NAME_SCOPE_EXTENDED y llame a SQLColumns (ODBC). Llame a IDBSchemaRowset::GetRowset para el conjunto de filas de esquema de DBSCHEMA_COLUMNS_EXTENDED (OLE DB). Este escenario no es posible desde una aplicación que use SQL Server Native Client desde una versión anterior a SQL Server 2008 (10.0.x). Sin embargo, esta aplicación podría consultar directamente las vistas del sistema. |
Recuperar únicamente los metadatos de las columnas que son miembros del column_set. Esto podría devolver un número muy grande de filas. | Establezca el campo descriptor SQL_SOPT_SS_NAME_SCOPE en SQL_SS_NAME_SCOPE_SPARSE_COLUMN_SET y llame a SQLColumns (ODBC). Llame a IDBSchemaRowset::GetRowset para el conjunto de filas de esquema de DBSCHEMA_SPARSE_COLUMN_SET (OLE DB). Este escenario no es posible desde una aplicación que use SQL Server Native Client desde una versión anterior a SQL Server 2008 (10.0.x). Sin embargo, este tipo de aplicación podría consultar las vistas del sistema. |
Determinar si una columna es dispersa. | Consulte la columna SS_IS_SPARSE del conjunto de resultados SQLColumns (ODBC). Consulte la columna SS_IS_SPARSE del conjunto de filas de esquema DBSCHEMA_COLUMNS (OLE DB). Este escenario no es posible desde una aplicación que use SQL Server Native Client desde una versión anterior a SQL Server 2008 (10.0.x). Sin embargo, este tipo de aplicación podría consultar las vistas del sistema. |
Determine si una columna es column_set. | Consulte la columna SS_IS_COLUMN_SET del conjunto de resultados SQLColumns. O bien, consulte el atributo de columna específico de SQL Server SQL_CA_SS_IS_COLUMN_SET (ODBC). Consulte la columna SS_IS_COLUMN_SET del conjunto de filas de esquema DBSCHEMA_COLUMNS. O bien, consulte dwFlags devuelto por IColumnsinfo::GetColumnInfo o DBCOLUMNFLAGS en el conjunto de filas devuelto por IColumnsRowset::GetColumnsRowset. Para column_set columnas, se establecerá DBCOLUMNFLAGS_SS_ISCOLUMNSET (OLE DB). Este escenario no es posible desde una aplicación que use SQL Server Native Client desde una versión anterior a SQL Server 2008 (10.0.x). Sin embargo, este tipo de aplicación podría consultar las vistas del sistema. |
Importar y exportar columnas dispersas en BCP de una tabla sin column_set. | No hay ningún cambio en el comportamiento de versiones anteriores de SQL Server Native Client. |
Importar y exportar columnas dispersas en BCP de una tabla con column_set. | column_set se importa y se exporta de la misma forma que una columna XML; es decir, como varbinary(max) si se enlaza como un tipo binario, o como nvarchar(max) si se enlaza como un tipo char o wchar. Las columnas que son miembro del column_set disperso no se exportan como columnas distintas; se exportan solo en el valor del column_set. |
Comportamiento de queryout para BCP. | No hay ningún cambio en el control de columnas con nombre explícita de versiones anteriores de SQL Server Native Client. Los escenarios que implican la importación y exportación entre tablas con esquemas diferentes pueden requerir un tratamiento especial. Para obtener más información acerca de BCP, vea Compatibilidad de la copia masiva (BCP) con columnas dispersas, más adelante en este tema. |
Comportamiento del cliente de nivel inferior
Los clientes de nivel inferior solo devolverán los metadatos de las columnas que no son miembro del column_set disperso para SQLColumns y DBSCHMA_COLUMNS. Los conjuntos de filas de esquema OLE DB adicionales introducidos en SQL Server 2008 (10.0.x) Native Client no estarán disponibles ni las modificaciones en SQLColumns en ODBC a través de SQL_SOPT_SS_NAME_SCOPE.
Los clientes de nivel inferior pueden acceder a las columnas que son miembros del column_set disperso por nombre, y la columna del column_set será accesible como una columna XML para los clientes de SQL Server 2005 (9.x).
Compatibilidad de la copia masiva (BCP) con columnas dispersas
No hay ningún cambio en la API de BCP en ODBC o OLE DB para las columnas dispersas o las características de column_set .
Si una tabla tiene un column_set, las columnas dispersas no se tratan como columnas distintas. Los valores de todas las columnas dispersas están incluidos en el valor de column_set, que se exporta de la misma manera que una columna XML; es decir, como varbinary(max) si se enlaza como un tipo binario, o como nvarchar(max) si se enlaza como un tipo char o wchar. En la importación, el valor de column_set debe cumplir el esquema de column_set.
Para las operaciones queryout, no hay ningún cambio en la manera en que se tratan las columnas a las que se hace referencia. Las columnas column_set tienen el mismo comportamiento que las columnas XML y la dispersión no tiene ningún efecto en el tratamiento de las columnas dispersas indicadas.
En cambio, si se usa queryout para la exportación y hace referencia a las columnas dispersas que son miembros de la columna dispersa establecida por nombre, no puede realizar una importación directa en una tabla con estructura similar. Esto se debe a que BCP usa los metadatos de forma coherente con una operación select * para la importación y no puede hacer coincidir las columnas del miembro column_set con estos metadatos. Para importar individualmente las columnas miembro del column_set, debe definir una vista en la tabla que haga referencia a las columnas column_set deseadas y debe realizar la operación de importación mediante la vista.