Tipos CLR grandes definidos por el usuario (ODBC)
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 ver un ejemplo en el que se muestra la compatibilidad de ODBC para los UDT de CLR grandes, vea Compatibilidad con UDT de gran tamaño.
Para obtener más información acerca de la compatibilidad con tipos UDT de CLR grandes en SQL Server Native Client, vea Tipos definidos por el usuario de CLR grandes.
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:
Tipo de datos de SQL Server |
Tipo de datos de SQL |
Valor |
---|---|---|
UDT CLR |
SQL_SS_UDT |
-151 (sqlncli.h) |
En la tabla siguiente se describe la estructura y el tipo C de ODBC correspondiente. Esencialmente, un tipo UDT CLR 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. |
Para los parámetros UDT, SQL_CA_SS_UDT_TYPE_NAME debe establecerse siempre 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 que cualquier columna específica del controlador del conjunto de resultados de SQLColumns o SQLProcedureColumns.
SQLGetTypeInfo no devuelve ninguna fila para los UDT individuales ni 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 |
Compatible * |
SQL_C_BINARY |
Compatible |
SQL_C_CHAR |
Compatible * |
* 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 |
Compatible * |
SQL_C_BINARY |
Compatible |
SQL_C_CHAR |
Compatible * |
* 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 las columnas de resultados UDT se convierten de tipos de datos SQL a C, tal y como se describía en la sección "Enlaces y conversiones" anteriormente en este tema.
SQLBindParameter
Los valores requeridos para los UDT son los siguientes:
Tipo de datos 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 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.
SQLDescribeCol
Los valores devueltos para los UDT son los siguientes:
Tipo de datos 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 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 las columnas de resultados UDT se convierten de tipos de datos SQL a C, tal y como se describía en la sección "Enlaces y conversiones" anteriormente en este tema.
SQLFetchScroll
Los valores de las columnas de resultados UDT se convierten de tipos de datos SQL a C, tal y como se describía en la sección "Enlaces y conversiones" anteriormente en este tema.
SQLGetData
Los valores de las columnas de resultados UDT se convierten de tipos de datos SQL a C, tal y como se describía 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 |
Longitud |
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ámetros UDT se convierten de tipos de datos C a SQL, tal y como se describía 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 |
Longitud |
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.