Usar tipos definidos por el usuario
Los tipos definidos por el usuario (UDT) se introdujeron en SQL Server 2005. Los UDT amplían el sistema de tipos SQL ya que permiten almacenar objetos y estructuras de datos personalizadas en una base de datos de SQL Server. Los UDT pueden contener varios tipos de datos y pueden presentar distintos comportamientos, lo que los diferencia de los tipos de datos de alias tradicionales que constan de un único tipo de datos del sistema de SQL Server. Los UDT pueden definirse mediante cualquiera de los lenguajes compatibles con .NET Common Language Runtime (CLR) que genere código comprobable, como Microsoft Visual C#® y Visual Basic® .NET. Los datos se exponen como campos y propiedades de una clase o estructura de .NET, y los métodos de esa clase o estructura definen los comportamientos.
Un UDT puede usarse como la definición de columna de una tabla, como una variable de un lote Transact-SQL o como un argumento de una función o procedimiento almacenado Transact-SQL. Para obtener más información acerca de los UDT, vea Trabajar con tipos definidos por el usuario para CLR.
Proveedor OLE DB de SQL Server Native Client
El proveedor OLE DB de SQL Server Native Client admite los UDT como tipos binarios con información de metadatos, lo que permite administrar los UDT como objetos. Las columnas UDT se exponen como DBTYPE_UDT y sus metadatos se exponen a través de la interfaz OLE DB básica IColumnRowset y la nueva interfaz ISSCommandWithParameters.
Nota
El método IRowsetFind::FindNextRow no funciona con el tipo de datos UDT. Si el UDT se usa como un tipo de columna de búsqueda, se devuelve DB_E_BADCOMPAREOP.
Enlaces y conversiones de datos
En la tabla siguiente se describe el enlace y la conversión que tiene lugar al usar los tipos de datos enumerados con un UDT de SQL Server. Las columnas UDT se exponen a través del proveedor OLE DB de SQL Server Native Client como DBTYPE_UDT. Puede obtener metadatos mediante los conjuntos de filas de esquema adecuados, de modo que pueda administrar sus propios tipos definidos como objetos.
Tipo de datos |
A un tipo UDT del servidor |
A un tipo no UDT del servidor |
Desde un tipo UDT del servidor |
Desde un tipo no UDT del servidor |
---|---|---|---|---|
DBTYPE_UDT |
Compatible6 |
Error1 |
Compatible6 |
Error5 |
DBTYPE_BYTES |
Compatible6 |
N/D2 |
Compatible6 |
N/D2 |
DBTYPE_WSTR |
Compatible3,6 |
N/D2 |
Compatible4,6 |
N/D2 |
DBTYPE_BSTR |
Compatible3,6 |
N/D2 |
Compatible4 |
N/D2 |
DBTYPE_STR |
Compatible3,6 |
N/D2 |
Compatible4,6 |
N/D2 |
DBTYPE_IUNKNOWN |
No compatible |
N/D2 |
No compatible |
N/D2 |
DBTYPE_VARIANT (VT_UI1 | VT_ARRAY) |
Compatible6 |
N/D2 |
Compatible4 |
N/D2 |
DBTYPE_VARIANT (VT_BSTR) |
Compatible3,6 |
N/D2 |
N/D |
N/D2 |
1Si se especifica un tipo de servidor distinto de DBTYPE_UDT con ICommandWithParameters::SetParameterInfo y el tipo de descriptor de acceso es DBTYPE_UDT, se produce un error cuando se ejecuta la instrucción (DB_E_ERRORSOCCURRED; el estado del parámetro es DBSTATUS_E_BADACCESSOR). De lo contrario, los datos se envían al servidor, pero el servidor devuelve un error que indica que no hay ninguna conversión implícita de UDT al tipo de datos del parámetro.
2Más allá del ámbito de este tema.
3Las cadenas hexadecimales se convierten en datos binarios.
4Los datos binarios se convierten en cadenas hexadecimales.
5La validación puede tener lugar en el momento de creación del descriptor de acceso o en el momento de la captura; el error es DB_E_ERRORSOCCURRED, con el estado de enlace establecido en DBBINDSTATUS_UNSUPPORTEDCONVERSION.
6Puede usarse BY_REF.
DBTYPE_NULL y DBTYPE_EMPTY pueden enlazarse en parámetros de entrada, pero no en parámetros de salida ni en resultados. Cuando se enlazan para parámetros de entrada, el estado debe establecerse en DBSTATUS_S_ISNULL o DBSTATUS_S_DEFAULT.
DBTYPE_UDT también puede convertirse en DBTYPE_EMPTY y DBTYPE_NULL, pero DBTYPE_NULL y DBTYPE_EMPTY no pueden convertirse en DBTYPE_UDT. Este comportamiento es coherente con el de DBTYPE_BYTES.
Nota
Se usa una nueva interfaz para tratar los UDT como parámetros, la interfaz ISSCommandWithParameters, que hereda de ICommandWithParameters. Las aplicaciones deben usar esta interfaz para establecer al menos la propiedad SSPROP_PARAM_UDT_NAME del conjunto de propiedades DBPROPSET_SQLSERVERPARAMETER para los parámetros UDT. De lo contrario, ICommand::Execute devolverá DB_E_ERRORSOCCURRED. Esta interfaz y este conjunto de propiedades se describen más adelante en este tema.
Si un tipo definido por el usuario se inserta en una columna que no es lo suficientemente grande como para contener todos sus datos, ICommand::Execute devuelve S_OK con un estado DB_E_ERRORSOCCURRED.
Las conversiones de datos que proporcionan los servicios principales de OLE DB (IDataConvert) no son aplicables a DBTYPE_UDT. No se admite ningún otro enlace.
Adiciones y cambios en los conjuntos de filas de OLE DB
SQL Server Native Client agrega nuevos valores o cambios a muchos de los conjuntos de filas de esquema básicos de OLE DB.
El conjunto de filas de esquema PROCEDURE_PARAMETERS
Se han realizado las siguientes adiciones al conjunto de filas de esquema PROCEDURE_PARAMETERS.
Nombre de la columna |
Tipo |
Descripción |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Identificador de nombre de tres partes. |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Identificador de nombre de tres partes. |
SS_UDT_NAME |
DBTYPE_WSTR |
Identificador de nombre de tres partes. |
SS_UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Nombre de ensamblado completo, que incluye el nombre de tipo y toda la identificación de ensamblado necesaria a la que debe hacer referencia CLR. |
El conjunto de filas de esquema SQL_ASSEMBLIES
El proveedor OLE DB de SQL Server Native Client expone un nuevo conjunto de filas de esquema específico del proveedor que describe los UDT registrados. El servidor ASSEMBLY puede especificarse como DBTYPE_WSTR, pero no está presente en el conjunto de filas. Si no se especifica, el conjunto de filas tendrá como valor predeterminado el servidor actual. El conjunto de filas de esquema SQL_ASSEMBLIES se define en la tabla siguiente.
Nombre de la columna |
Tipo |
Descripción |
---|---|---|
ASSEMBLY_CATALOG |
DBTYPE_WSTR |
Nombre de catálogo del ensamblado que contiene el tipo. |
ASSEMBLY_SCHEMA |
DBTYPE_WSTR |
Nombre de esquema o nombre de propietario del ensamblado que contiene el tipo. Aunque el ámbito de los ensamblados viene determinado por la base de datos y no por el esquema, los ensamblados tienen un propietario que se refleja aquí. |
ASSEMBLY_NAME |
DBTYPE_WSTR |
Nombre del ensamblado que contiene el tipo. |
ASSEMBLY_ID |
DBTYPE_UI4 |
Identificador de objeto del ensamblado que contiene el tipo. |
PERMISSION_SET |
DBTYPE_WSTR |
Valor que indica el ámbito de acceso del ensamblado. Entre los valores posibles se incluyen "SAFE", "EXTERNAL_ACCESS" y "UNSAFE". |
ASSEMBLY_BINARY |
DBTYPE_BYTES |
Representación binaria del ensamblado. |
El conjunto de filas de esquema SQL_ASSEMBLIES_DEPENDENCIES
El proveedor OLE DB de SQL Server Native Client expone un nuevo conjunto de filas de esquema específico del proveedor que describe las dependencias de ensamblado de un servidor especificado. El autor de la llamada puede especificar ASSEMBLY_SERVER como DBTYPE_WSTR, pero no está presente en el conjunto de filas. Si no se especifica, el conjunto de filas tendrá como valor predeterminado el servidor actual. El conjunto de filas de esquema SQL_ASSEMBLY_DEPENDENCIES se define en la tabla siguiente.
Nombre de la columna |
Tipo |
Descripción |
---|---|---|
ASSEMBLY_CATALOG |
DBTYPE_WSTR |
Nombre de catálogo del ensamblado que contiene el tipo. |
ASSEMBLY_SCHEMA |
DBTYPE_WSTR |
Nombre de esquema o nombre de propietario del ensamblado que contiene el tipo. Aunque el ámbito de los ensamblados viene determinado por la base de datos y no por el esquema, los ensamblados tienen un propietario que se refleja aquí. |
ASSEMBLY_ID |
DBTYPE_UI4 |
Identificador de objeto del ensamblado. |
REFERENCED_ASSEMBLY_ID |
DBTYPE_UI4 |
Identificador de objeto del ensamblado al que se hace referencia. |
El conjunto de filas de esquema SQL_USER_TYPES
El proveedor OLE DB de SQL Server Native Client expone un nuevo conjunto de filas de esquema, SQL_USER_TYPES, que describe cuándo deben agregarse los UDT registrados para un servidor especificado. El autor de la llamada debe especificar UDT_SERVER como DBTYPE_WSTR, pero no está presente en el conjunto de filas. El conjunto de filas de esquema SQL_USER_TYPES se define en la tabla siguiente.
Nombre de la columna |
Tipo |
Descripción |
---|---|---|
UDT_CATALOGNAME |
DBTYPE_WSTR |
Para las columnas UDT, esta propiedad es una cadena que especifica el nombre del catálogo donde se define el UDT. |
UDT_SCHEMANAME |
DBTYPE_WSTR |
Para las columnas UDT, esta propiedad es una cadena que especifica el nombre del esquema donde se define el UDT. |
UDT_NAME |
DBTYPE_WSTR |
Nombre del ensamblado que contiene la clase UDT. |
UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
El nombre de tipo completo (AQN) incluye el nombre de tipo precedido del espacio de nombres, si procede. |
El conjunto de filas de esquema COLUMNS
Las adiciones al conjunto de filas de esquema COLUMNS incluyen las columnas siguientes.
Nombre de la columna |
Tipo |
Descripción |
---|---|---|
SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Para las columnas UDT, esta propiedad es una cadena que especifica el nombre del catálogo donde se define el UDT. |
SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Para las columnas UDT, esta propiedad es una cadena que especifica el nombre del esquema donde se define el UDT. |
SS_UDT_NAME |
DBTYPE_WSTR |
Nombre del UDT. |
SS_UDT_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
El nombre de tipo completo (AQN) incluye el nombre de tipo precedido del espacio de nombres, si procede. |
Adiciones y cambios en los conjuntos de propiedades de OLE DB
SQL Server Native Client agrega nuevos valores o cambios a muchos de los conjuntos de propiedades de OLE DB.
El conjunto de propiedades DBPROPSET_SQLSERVERPARAMETER
Para admitir los UDT a través de OLE DB, SQL Server Native Client implementa el nuevo conjunto de propiedades DBPROPSET_SQLSERVERPARAMETER, que contiene los valores siguientes.
Nombre |
Tipo |
Descripción |
---|---|---|
SSPROP_PARAM_UDT_CATALOGNAME |
DBTYPE_WSTR |
Identificador de nombre de tres partes. Para los parámetros UDT, esta propiedad es una cadena que especifica el nombre del catálogo donde se define el tipo definido por el usuario. |
SSPROP_PARAM_UDT_SCHEMANAME |
DBTYPE_WSTR |
Identificador de nombre de tres partes. Para los parámetros UDT, esta propiedad es una cadena que especifica el nombre del esquema donde se define el tipo definido por el usuario. |
SSPROP_PARAM_UDT_NAME |
DBTYPE_WSTR |
Identificador de nombre de tres partes. Para las columnas UDT, esta propiedad es una cadena que especifica el nombre de una sola parte del tipo definido por el usuario. |
La propiedad SSPROP_PARAM_UDT_NAME es obligatoria. Las propiedades SSPROP_PARAM_UDT_CATALOGNAME y SSPROP_PARAM_UDT_SCHEMANAME son opcionales. Si alguna de las propiedades se especifica incorrectamente, se devolverá DB_E_ERRORSINCOMMAND. Si no se especifican las propiedades SSPROP_PARAM_UDT_CATALOGNAME y SSPROP_PARAM_UDT_SCHEMANAME, el UDT debe definirse en la misma base de datos y esquema que la tabla. Si la definición UDT no está en el mismo esquema que la tabla (pero está en la misma base de datos), debe especificarse la propiedad SSPROP_PARAM_UDT_SCHEMANAME. Si la definición UDT está en una base de datos diferente, deben especificarse las propiedades SSPROP_PARAM_UDT_CATALOGNAME y SSPROP_PARAM_UDT_SCHEMANAME.
El conjunto de propiedades DBPROPSET_SQLSERVERCOLUMN
Para admitir la creación de tablas en la interfaz ITableDefinition, SQL Server Native Client agrega las siguientes tres nuevas columnas al conjunto de propiedades DBPROPSET_SQLSERVERCOLUMN.
Nombre |
Descripción |
Tipo |
Descripción |
---|---|---|---|
SSPROP_COL_UDT_CATALOGNAME |
UDT_CATALOGNAME |
VT_BSTR |
Para las columnas de tipo DBTYPE_UDT, esta propiedad es una cadena que especifica el nombre del catálogo donde se define el UDT. |
SSPROP_COL_UDT_SCHEMANAME |
UDT_SCHEMANAME |
VT_BSTR |
Para las columnas de tipo DBTYPE_UDT, esta propiedad es una cadena que especifica el nombre del esquema donde se define el UDT. |
SSPROP_COL_UDT_NAME |
UDT_NAME |
VT_BSTR |
Para las columnas de tipo DBTYPE_UDT, esta propiedad es una cadena que especifica el nombre de una sola parte del UDT. Para otros tipos de columna, esta propiedad devuelve una cadena vacía. |
Nota
Los UDT no aparecerán en el conjunto de filas de esquema PROVIDER_TYPES. Todas las columnas tienen acceso de lectura y escritura.
ADO hará referencia a estas propiedades utilizando la entrada correspondiente de la columna Descripción.
La propiedad SSPROP_COL_UDTNAME es obligatoria. Las propiedades SSPROP_COL_UDT_CATALOGNAME y SSPROP_COL_UDT_SCHEMANAME son opcionales. Si alguna de las propiedades se especifica incorrectamente, se devolverá DB_E_ERRORSINCOMMAND.
Si no se especifican las propiedades SSPROP_COL_UDT_CATALOGNAME y SSPROP_COL_UDT_SCHEMANAME, el UDT debe definirse en la misma base de datos y esquema que la tabla.
Si la definición UDT no está en el mismo esquema que la tabla (pero está en la misma base de datos), debe especificarse la propiedad SSPROP_COL_UDT_SCHEMANAME.
Si la definición UDT está en una base de datos diferente, deben especificarse las propiedades SSPROP_COL_UDT_CATALOGNAME y SSPROP_COL_UDT_SCHEMANAME.
Adiciones y cambios en las interfaces de OLE DB
SQL Server Native Client agrega nuevos valores o cambios a muchas de las interfaces básicas de OLE DB.
La interfaz ISSCommandWithParameters
Para admitir los UDT a través de OLE DB, SQL Server Native Client implementa diversos cambios, incluida la adición de la interfaz ISSCommandWithParameters. Esta nueva interfaz hereda de la interfaz OLE DB básica ICommandWithParameters. Además de los tres métodos heredados de ICommandWithParameters, GetParameterInfo, MapParameterNames y SetParameterInfo, ISSCommandWithParameters proporciona los métodos SetParameterProperties y GetParameterProperties, que se usan para administrar tipos de datos específicos del servidor.
Nota
La interfaz ISSCommandWithParameters también usa la nueva estructura SSPARAMPROPS.
La interfaz IColumnsRowset
Además de la interfaz ISSCommandWithParameters, SQL Server Native Client también agrega nuevos valores al conjunto de filas que se devuelve al llamar al método IColumnsRowset::GetColumnRowset, incluidos los siguientes.
Nombre de la columna |
Tipo |
Descripción |
---|---|---|
DBCOLUMN_SS_UDT_CATALOGNAME |
DBTYPE_WSTR |
Identificador de nombre de catálogo UDT. |
DBCOLUMN_SS_UDT_SCHEMANAME |
DBTYPE_WSTR |
Identificador de nombre de esquema UDT. |
DBCOLUMN_SS_UDT_NAME |
DBTYPE_WSTR |
Identificador de nombre UDT. |
DBCOLUMN_SS_ASSEMBLY_TYPENAME |
DBTYPE_WSTR |
Nombre de ensamblado completo, que incluye el nombre de tipo y toda la identificación de ensamblado necesaria a la que debe hacer referencia CLR. |
Es posible diferenciar una columna UDT del servidor de otros tipos binarios cuando el parámetro DBCOLUMN_TYPE está establecido en DBTYPE_UDT; para ello, hay que examinar los metadatos UDT agregados especificados anteriormente. Si esos datos están parcialmente completos, el tipo del servidor es un UDT. Para los tipos del servidor que no son UDT, estas columnas se devuelven siempre como NULL.
Controlador ODBC de SQL Server Native Client
Se han realizado varios cambios en el controlador ODBC de SQL Server Native Client para admitir los UDT. El controlador ODBC de SQL Server Native Client asigna el UDT de SQL Server al identificador de tipo de datos SQL específico del controlador SQL_SS_UDT. Las columnas UDT se exponen como SQL_SS_UDT. Si asigna explícitamente una columna UDT a otro tipo en una instrucción SQL utilizando los métodos ToXMLString o ToString del UDT o a través de la función CAST/CONVERT, el tipo de la columna del conjunto de resultados refleja el tipo real al que se ha convertido la columna.
SQLColAttribute, SQLDescribeParam, SQLGetDescField
Se han agregado cuatro nuevos campos descriptores específicos del controlador para proporcionar información adicional para una columna UDT de un conjunto de resultados o un parámetro UDT de un procedimiento almacenado o una consulta con parámetros, que deben recuperarse a través de las funciones SQLColAttribute, SQLDescribeParam y SQLGetDescField.
Estos cuatro nuevos campos descriptores que se han agregado son SQL_CA_SS_UDT_CATALOG_NAME, SQL_CA_SS_UDT_SCHEMA_NAME, SQL_CA_SS_UDT_TYPE_NAME y SQL_CA_SS_UDT_ASSEMBLY_TYPE_NAME.
SQLColumns, SQLProcedureColumns
Además, se han agregado tres nuevas columnas específicas del controlador al conjunto de resultados devuelto por las funciones SQLColumns y SQLProcedureColumns, para proporcionar información adicional sobre una columna de conjunto de resultados UDT o un parámetro UDT. Estas tres nuevas columnas son SS_UDT_CATALOG_NAME, SS_UDT_SCHEMA_NAME y SS_UDT_ASSEMBLY_TYPE_NAME.
Conversiones admitidas
Al convertir tipos de datos de SQL a C, SQL_C_WCHAR, SQL_C_BINARY y SQL_C_CHAR pueden convertirse en SQL_SS_UDT. Tenga en cuenta, no obstante, que los datos binarios se convierten en una cadena hexadecimal cuando se realizan conversiones desde los tipos de datos SQL SQL_C_CHAR y SQL_C_WCHAR.
Al convertir tipos de datos de C a SQL, SQL_C_WCHAR, SQL_C_BINARY y SQL_C_CHAR pueden convertirse en SQL_SS_UDT. Tenga en cuenta, no obstante, que los datos binarios se convierten en una cadena hexadecimal cuando se realizan conversiones desde los tipos de datos SQL SQL_C_CHAR y SQL_C_WCHAR.
Vea también