Tipos CLR grandes definidos por el usuario (ODBC)

Se aplica a:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

Importante

SQL Server Native Client (a menudo abreviado SNAC) se ha quitado de SQL Server 2022 (16.x) y SQL Server Management Studio 19 (SSMS). No se recomienda SQL Server Native Client (SQLNCLI o SQLNCLI11) ni el proveedor OLE DB de Microsoft heredado para SQL Server (SQLOLEDB) para el desarrollo de nuevas aplicaciones. Cambie al nuevo controlador OLE DB de Microsoft (MSOLEDBSQL) para SQL Server o al controlador ODBC de Microsoft ODBC Driver for SQL Server más reciente de ahora en adelante. Para SQLNCLI que se incluye como componente de SQL Server motor de base de datos (versiones 2012 a 2019), consulte esta excepción de ciclo de vida de soporte técnico.

En este tema se describen los cambios realizados en ODBC en SQL Server Native Client para admitir los tipos definidos por el usuario (UDT) de Common Language Runtime (CLR) grandes.

Para obtener un ejemplo que muestra la compatibilidad de ODBC con udT clR de gran tamaño, consulte Compatibilidad con UDT grandes.

Para obtener más información sobre la compatibilidad con udT clR de gran tamaño en SQL Server Native Client, vea Large CLR User-Defined Types.

Formato de datos

SQL Server Native Client usa SQL_SS_LENGTH_UNLIMITED para indicar que el tamaño de una columna es superior a 8.000 bytes para los tipos de objeto grandes (LOB). A partir de SQL Server 2008, se usa el mismo valor para los tipos UDT CLR cuando su tamaño es superior a 8.000 bytes.

Los valores UDT se representan como matrices de bytes. Se admiten conversiones a cadenas hexadecimales y desde cadenas hexadecimales. Los valores literales se representan como cadenas hexadecimales con el prefijo "0x".

En la tabla siguiente se muestra la asignación de tipos de datos en parámetros y conjuntos de resultados:

Tipos de datos de SQL Server Tipo de datos de SQL Value
UDT CLR SQL_SS_UDT -151 (sqlncli.h)

En la tabla siguiente se describe la estructura y el tipo C de ODBC correspondiente. Básicamente, CLR UDT es un tipo varbinary con metadatos adicionales.

Tipo de datos de SQL Diseño de memoria Tipo de datos C Valor (sqlext.h)
SQL_SS_UDT SQLCHAR *(char sin signo *) SQL_C_BINARY SQL_BINARY (-2)

Campos descriptores de parámetros

La información que se devuelve en los campos IPD es la siguiente:

Campo descriptor SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL_DESC_CASE_SENSITIVE SQL_FALSE SQL_FALSE
SQL_DESC_CONCISE_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_DATETIME_INTERVAL_CODE 0 0
SQL_DESC_DATETIME_INTERVAL_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE SQL_FALSE
SQL_DESC_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_LOCAL_TYPE_NAME "udt" "udt"
SQL_DESC_OCTET_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_SCALE 0 0
SQL_DESC_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_TYPE_NAME "udt" "udt"
SQL_DESC_UNSIGNED SQL_TRUE SQL_TRUE
SQL_CA_SS_UDT_CATALOG_NAME Nombre del catálogo que contiene el UDT. Nombre del catálogo que contiene el UDT.
SQL_CA_SS_UDT_SCHEMA_NAME Nombre del esquema que contiene el UDT. Nombre del esquema que contiene el UDT.
SQL_CA_SS_UDT_TYPE_NAME Nombre del UDT. Nombre del UDT.
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME Nombre completo del UDT. Nombre completo del UDT.

En el caso de los parámetros UDT, SQL_CA_SS_UDT_TYPE_NAME siempre se deben establecer a través de SQLSetDescField. SQL_CA_SS_UDT_CATALOG_NAME y SQL_CA_SS_UDT_SCHEMA_NAME son opcionales.

Si el UDT se define en la misma base de datos con un esquema distinto que la tabla, debe establecerse SQL_CA_SS_UDT_SCHEMA_NAME.

Si el UDT se define en una base de datos distinta que la tabla, deben establecerse SQL_CA_SS_UDT_CATALOG_NAME y SQL_CA_SS_UDT_SCHEMA_NAME.

Si hay algún error u omisión en los valores de SQL_CA_SS_UDT_TYPE_NAME, SQL_CA_SS_UDT_CATALOG_NAME o SQL_CA_SS_UDT_SCHEMA_NAME, se genera un registro de diagnóstico con SQLSTATE HY000 y el texto de mensaje específico del servidor.

Campos descriptores de resultados

La información que se devuelve en los campos IRD es la siguiente:

Campo descriptor SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL_DESC_AUTO_UNIQUE_VALUE SQL_FALSE SQL_FALSE
SQL_DESC_CASE_SENSITIVE SQL_FALSE SQL_FALSE
SQL_DESC_CONCISE_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_DATETIME_INTERVAL_CODE 0 0
SQL_DESC_DATETIME_INTERVAL_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_DISPLAY_SIZE 2n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_FIXED_PREC_SCALE SQL_FALSE SQL_FALSE
SQL_DESC_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_LITERAL_PREFIX "0x" "0x"
SQL_DESC_LITERAL_SUFFIX "" ""
SQL_DESC_LOCAL_TYPE_NAME "udt" "udt"
SQL_DESC_OCTET_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_PRECISION n SQL_SS_LENGTH_UNLIMITED (0)
SQL_DESC_SCALE 0 0
SQL_DESC_SEARCHABLE SQL_PRED_NONE SQL_PRED_NONE
SQL_DESC_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DESC_TYPE_NAME "udt" "udt"
SQL_DESC_UNSIGNED SQL_TRUE SQL_TRUE
SQL_CA_SS_UDT_CATALOG_NAME Nombre del catálogo que contiene el UDT. Nombre del catálogo que contiene el UDT.
SQL_CA_SS_UDT_SCHEMA_NAME Nombre del esquema que contiene el UDT. Nombre del esquema que contiene el UDT.
SQL_CA_SS_UDT_TYPE_NAME Nombre del UDT. Nombre del UDT.
SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME Nombre completo del UDT. Nombre completo del UDT.

Metadatos de columna devueltos por SQLColumns y SQLProcedureColumns (metadatos de catálogo)

Para los UDT se devuelven los siguientes valores de columna:

Nombre de la columna SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
DATA_TYPE SQL_SS_UDT SQL_SS_UDT
TYPE_NAME Nombre del UDT. Nombre del UDT.
COLUMN_SIZE n SQL_SS_LENGTH_UNLIMITED (0)
BUFFER_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
DECIMAL_DIGITS NULL NULL
SQL_DATA_TYPE SQL_SS_UDT SQL_SS_UDT
SQL_DATETIME_SUB NULL NULL
CHAR_OCTET_LENGTH n SQL_SS_LENGTH_UNLIMITED (0)
SS_UDT_CATALOG_NAME Nombre del catálogo que contiene el UDT. Nombre del catálogo que contiene el UDT.
SS_UDT_SCHEMA_NAME Nombre del esquema que contiene el UDT. Nombre del esquema que contiene el UDT.
SS_UDT_ASSEMBLY_TYPE_NAME Nombre completo del UDT. Nombre completo del UDT.

Las últimas tres columnas son columnas específicas del controlador. Se agregan después de cualquier columna definida por ODBC, pero antes de cualquier columna específica del controlador existente del conjunto de resultados de SQLColumns o SQLProcedureColumns.

SQLGetTypeInfo no devuelve ninguna fila, para udT individuales o para el tipo genérico "udt".

Enlaces y conversiones

Las conversiones compatibles de tipos de datos SQL a C son las siguientes:

Conversión a y desde: SQL_SS_UDT
SQL_C_WCHAR Apoyado*
SQL_C_BINARY Compatible
SQL_C_CHAR Apoyado*

* Los datos binarios se convierten en una cadena hexadecimal.

Las conversiones compatibles de tipos de datos C a SQL son las siguientes:

Conversión a y desde: SQL_SS_UDT
SQL_C_WCHAR Apoyado*
SQL_C_BINARY Compatible
SQL_C_CHAR Apoyado*

* Las cadenas hexadecimales se convierten en datos binarios.

Compatibilidad de SQL_VARIANT con los UDT

Los UDT no se admiten en columnas SQL_VARIANT.

Compatibilidad de BCP con los UDT

Los valores UDT pueden importarse y exportarse solo como valores de caracteres o binarios.

Comportamiento del cliente de nivel inferior en los UDT

Los UDT están sujetos a la asignación de tipos con clientes de nivel inferior, tal y como se indica a continuación:

Versión del servidor SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL Server 2005 UDT varbinary(max)
SQL Server 2008 y posterior UDT UDT

Funciones ODBC compatibles con UDT de CLR grandes

En esta sección se describen los cambios realizados en las funciones ODBC de SQL Server Native Client para admitir UDT de CLR grandes.

SQLBindCol

Los valores de columna de resultado UDT se convierten de SQL a tipos de datos de C, como se describe en la sección "Enlaces y conversiones", anteriormente en este tema.

SQLBindParameter

Los valores requeridos para los UDT son los siguientes:

Tipo de datos de SQL Parametertype ColumnSizePtr DecimalDigitsPtr
SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT n 0
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL_SS_UDT SQL_SS_LENGTH_UNLIMITED (0) 0

SQLColAttribute

Los valores devueltos para los UDT son los que se describían en la sección "Campos descriptores de resultados" anteriormente en este tema.

SQLColumns

Los valores devueltos para udT son como se describe en la sección "Metadatos de columna devueltos por SQLColumns y SQLProcedureColumns (metadatos del catálogo)", anteriormente en este tema.

SQLDescribeCol

Los valores devueltos para los UDT son los siguientes:

Tipo de datos de SQL DataTypePtr ColumnSizePtr DecimalDigitsPtr
SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT n 0
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL_SS_UDT SQL_SS_LENGTH_UNLIMITED (0) 0

SQLDescribeParam

Los valores devueltos para los UDT son los siguientes:

Tipo de datos de SQL DataTypePtr ColumnSizePtr DecimalDigitsPtr
SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT n 0
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL_SS_UDT SQL_SS_LENGTH_UNLIMITED (0) 0

SQLFetch

Los valores de columna de resultado UDT se convierten de SQL a tipos de datos de C, como se describe en la sección "Enlaces y conversiones", anteriormente en este tema.

SQLFetchScroll

Los valores de columna de resultado UDT se convierten de SQL a tipos de datos de C, como se describe en la sección "Enlaces y conversiones", anteriormente en este tema.

SQLGetData

Los valores de columna de resultado UDT se convierten de SQL a tipos de datos de C, como se describe en la sección "Enlaces y conversiones", anteriormente en este tema.

SQLGetDescField

Los campos descriptores disponibles con los nuevos tipos se describen en las secciones "Campos descriptores de parámetros" y "Campos descriptores de resultados" anteriormente en este tema.

SQLGetDescRec

Los valores devueltos para los UDT son los siguientes:

Tipo de datos de SQL Tipo Subtipo Length Precisión Escala
SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT 0 n n 0
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL_SS_UDT 0 SQL_SS_LENGTH_UNLIMITED (0) SQL_SS_LENGTH_UNLIMITED (0) 0

SQLGetTypeInfo

Los valores devueltos para los UDT son los que se describían en la sección "Metadatos de columna devueltos por SQLColumns y SQLProcedureColumns (metadatos de catálogo)" anteriormente en este tema.

SQLProcedureColumns

Los valores devueltos para los UDT son los que se describían en la sección "Metadatos de columna devueltos por SQLColumns y SQLProcedureColumns (metadatos de catálogo)" anteriormente en este tema.

SQLPutData

Los valores de parámetro UDT se convierten de C a tipos de datos SQL, como se describe en la sección "Enlaces y conversiones", anteriormente en este tema.

SQLSetDescField

El campo descriptor disponible con los nuevos tipos se describe en las secciones "Campos descriptores de parámetros" y "Campos descriptores de resultados" anteriormente en este tema.

SQLSetDescRec

Los valores que se permiten para los UDT son los siguientes:

Tipo de datos de SQL Tipo Subtipo Length Precisión Escala
SQL_SS_UDT

(longitud menor o igual a 8.000 bytes)
SQL_SS_UDT 0 n n 0
SQL_SS_UDT

(longitud mayor que 8.000 bytes)
SQL_SS_UDT 0 SQL_SS_LENGTH_UNLIMITED (0) SQL_SS_LENGTH_UNLIMITED (0) 0

SQLSpecialColumns

Los valores devueltos para las columnas de los UDT DATA_TYPE, TYPE_NAME, COLUMN_SIZE, BUFFER_LENGTH y UDT DECIMAL_DIGTS son los que se describían en la sección "Metadatos devueltos por SQLColumns y SQLProcedureColumns (metadatos de catálogo)" anteriormente en este tema.

Consulte también

Tipos definidos por el usuario de CLR grandes