Nota
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Debe tomar varias decisiones de diseño importantes al crear un tipo definido por el usuario (UDT) que se va a instalar en SQL Server. Para la mayoría de los UDT, se recomienda la creación del UDT como una estructura, aunque también puede crearse como una clase. La definición de UDT debe cumplir las especificaciones para crear UDT para que se registren con SQL Server.
Requisitos para implementar UDT
Para ejecutarse en SQL Server, el UDT debe implementar los siguientes requisitos en la definición de UDT:
El UDT debe especificar el Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
. El uso del System.SerializableAttribute
es opcional, pero se recomienda.
El UDT debe implementar la interfaz
System.Data.SqlTypes.INullable
en la clase o estructura mediante la creación de unstatic
público (Shared
en Visual Basic)Null
método. SQL Server es compatible con valores NULL de forma predeterminada. Esto es necesario para que el código que se ejecuta en el UDT pueda reconocer un valor NULL.El UDT debe contener un
static
público (oShared
)Parse
método que admita el análisis y un método deToString
público para convertir en una representación de cadena del objeto.Un UDT con un formato de serialización definido por el usuario debe implementar la interfaz
System.Data.IBinarySerialize
y proporcionar unRead
y un métodoWrite
.El UDT debe implementar
System.Xml.Serialization.IXmlSerializable
, o todos los campos y propiedades públicos deben ser de tipos que sean serializables XML o decorados con el atributoXmlIgnore
si se requiere la invalidación de la serialización estándar.Solo debe haber una serialización de un objeto UDT. Se produce un error en la validación si las rutinas de serialización o deserialización reconocen más de una representación de un objeto determinado.
SqlUserDefinedTypeAttribute.IsByteOrdered
debe sertrue
comparar datos en orden de bytes. Si la interfaz deIComparable
no se implementa ySqlUserDefinedTypeAttribute.IsByteOrdered
esfalse
, se producirá un error en las comparaciones de orden de bytes.Un UDT definido en una clase debe tener un constructor público que no tome ningún argumento. Opcionalmente, puede crear más constructores de clase sobrecargados.
El UDT debe exponer elementos de datos como procedimientos de propiedad o campos públicos.
Los nombres públicos no pueden tener más de 128 caracteres y deben cumplir las reglas de nomenclatura de SQL Server para los identificadores definidos en los identificadores de Database.
sql_variant columnas no pueden contener instancias de un UDT.
Los miembros heredados no son accesibles desde Transact-SQL porque el sistema de tipos de SQL Server no conoce la jerarquía de herencia entre udT. Sin embargo, puede usar la herencia al estructurar sus clases y puede llamar a dichos métodos en la implementación del código administrado del tipo.
Los miembros no se pueden sobrecargar, excepto para el constructor de clase. Si crea un método sobrecargado, no se genera ningún error al registrar el ensamblado o crear el tipo en SQL Server. La detección del método sobrecargado se produce en tiempo de ejecución, no cuando se crea el tipo. Los métodos sobrecargados pueden existir en la clase siempre que nunca se invoquen. Al invocar al método sobrecargado se produce un error.
Los miembros de
static
(oShared
) deben declararse como constantes o como de solo lectura. Los miembros estáticos no pueden ser mutables.Si el campo
SqlUserDefinedTypeAttribute.MaxByteSize
está establecido en-1
, el UDT serializado puede ser tan grande como el límite de tamaño de objetos grandes (LOB) (actualmente 2 GB). El tamaño del UDT no puede superar el valor especificado en el campoMaxByteSized
.
Nota:
Aunque el servidor no lo usa para realizar comparaciones, puede implementar opcionalmente la interfaz System.IComparable
, que expone un único método, CompareTo
. Esto se usa en el lado cliente en situaciones en las que es conveniente comparar o ordenar con precisión los valores UDT.
Serialización nativa
Elegir los atributos de serialización adecuados para el UDT depende del tipo de UDT que está intentando crear. El Native
formato de serialización utiliza una estructura sencilla que permite a SQL Server almacenar una representación nativa eficaz del UDT en el disco. Se recomienda el formato Native
si el UDT es simple y solo contiene campos de los siguientes tipos:
Los tipos de valor que se componen de campos de estos tipos son buenos candidatos para Native
formato, como struct
en C#, o Structure
como se conocen en Visual Basic .NET. Por ejemplo, un UDT especificado con el formato de serialización Native
podría contener un campo de otro UDT que también se especificó con el formato Native
. Si la definición de UDT es más compleja y contiene tipos de datos que no están en la lista anterior, debe especificar el formato de serialización UserDefined
en su lugar.
El formato Native
tiene los siguientes requisitos:
El tipo no debe especificar un valor para
Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.MaxByteSize
.Todos los campos deben ser serializables.
El
System.Runtime.InteropServices.StructLayoutAttribute
debe especificarse comoStructLayout.LayoutKindSequential
si el UDT se define en una clase y no en una estructura. Este atributo controla el diseño físico de los campos de datos y se usa para imponer a los miembros que se coloquen en el orden en que aparecen. SQL Server usa este atributo para determinar el orden de campo de los UDT con varios valores.
Para obtener un ejemplo de un UDT definido con Native
serialización, consulte el Point
UDT en Creación de tipos definidos por el usuario con ADO.NET.
Serialización definida por el usuario
La configuración de formato UserDefined
para el atributo Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
proporciona al desarrollador control total sobre el formato binario. Al especificar la propiedad de atributo Format
como UserDefined
, debe realizar las siguientes acciones en el código:
Especifique la propiedad de atributo
IsByteOrdered
opcional. El valor predeterminado esfalse
.Especifique la propiedad
MaxByteSize
delMicrosoft.SqlServer.Server.SqlUserDefinedTypeAttribute
.Escriba código para implementar métodos
Read
yWrite
para el UDT mediante la implementación de la interfazSystem.Data.Sql.IBinarySerialize
.
Para obtener un ejemplo de un UDT definido con UserDefined
serialización, consulte el UDT de moneda en Creación de tipos definidos por el usuario con ADO.NET.
Nota:
Los campos UDT deben usar la serialización nativa o conservarse para indizarse.
Atributos de serialización
Los atributos determinan el modo de usar la serialización para construir la representación de almacenamiento de los UDT y para transmitirlos por valor al cliente. Es necesario especificar el Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
al crear el UDT. El atributo Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
indica que la clase es un UDT y especifica el almacenamiento para el UDT. Opcionalmente, puede especificar el atributo Serializable
, aunque SQL Server no lo requiere.
El Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute
tiene las siguientes propiedades.
Formato
Especifica el formato de serialización, que puede ser Native
o UserDefined
, en función de los tipos de datos del UDT.
IsByteOrdered
Valor de Boolean
que determina cómo SQL Server realiza comparaciones binarias en el UDT.
IsFixedLength
Indica si todas las instancias de este UDT tienen la misma longitud.
MaxByteSize
Tamaño máximo de la instancia, expresado en bytes. Debe especificar MaxByteSize
con el formato de serialización UserDefined
. Para un UDT con la serialización definida por el usuario especificada, MaxByteSize
hace referencia al tamaño total del UDT en su formato serializado según lo definido por el usuario. El valor de MaxByteSize
debe estar en el intervalo de 1
para 8000
o establecer en -1
para indicar que el UDT es mayor que 8000 bytes (el tamaño total no puede superar el tamaño máximo de LOB). Considere un UDT con una propiedad de una cadena de 10 caracteres (System.Char
). Cuando el UDT se serialice mediante BinaryWriter, el tamaño total de la cadena serializada será de 22 bytes: 2 bytes por carácter Unicode UTF-16, multiplicados por el número máximo de caracteres, más 2 bytes de control por la sobrecarga que se produce al serializar un flujo binario. Por lo tanto, al determinar el valor de MaxByteSize
, se debe tener en cuenta el tamaño total del UDT serializado: el tamaño de los datos serializados en formato binario más la sobrecarga que incurre en la serialización.
ValidationMethodName
Nombre del método utilizado para validar las instancias del UDT.
Establecer isbyteordered
Cuando la propiedad Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.IsByteOrdered
se establece en true
, está garantizando que los datos binarios serializados se pueden usar para el orden semántico de la información. De esta forma, cada instancia de un objeto UDT ordenado por bytes solamente puede tener una representación serializada. Cuando se realiza una operación de comparación en SQL Server en los bytes serializados, sus resultados deben ser los mismos que si la misma operación de comparación tuviera lugar en código administrado. Las siguientes características también se admiten cuando IsByteOrdered
se establece en true
:
Funcionalidad para crear los índices de las columnas de este tipo.
La capacidad de crear claves principales y externas, así como restricciones de
CHECK
yUNIQUE
en columnas de este tipo.La capacidad de usar Transact-SQL
ORDER BY
cláusulas ,GROUP BY
yPARTITION BY
. En estos casos, la representación binaria del tipo se usa para determinar el orden.La capacidad de usar operadores de comparación en instrucciones Transact-SQL.
Funcionalidad para conservar las columnas calculadas de este tipo.
Los formatos de serialización Native
y UserDefined
admiten los siguientes operadores de comparación cuando IsByteOrdered
se establece en true
:
- Igual a (
=
) - No es igual a (
!=
) - Mayor que (
>
) - Menor que (
<
) - Mayor o igual que (
>=
) - Menor o igual que (
<=
)
Implementación de la nulabilidad
Además de especificar correctamente los atributos de los ensamblados, la clase también debe admitir la nulabilidad. Los UDT cargados en SQL Server son compatibles con valores NULL, pero para que el UDT reconozca un valor NULL, la clase debe implementar la interfaz INullable
. Para obtener más información y un ejemplo de cómo implementar la nulabilidad en un UDT, vea Creación de tipos definidos por el usuario con ADO.NET.
Conversiones de cadenas
Para admitir la conversión de cadenas hacia y desde el UDT, debe proporcionar un método Parse
y un método ToString
en la clase . El método Parse
permite convertir una cadena en un UDT. Debe declararse como static
(o Shared
en Visual Basic) y tomar un parámetro de tipo System.Data.SqlTypes.SqlString
. Para obtener más información y un ejemplo de cómo implementar los métodos Parse
y ToString
, consulte Creación de tipos definidos por el usuario con ADO.NET.
Serialización XML
Los UDT deben admitir la conversión hacia y desde el tipo de datos xml conforme al contrato para la serialización XML. El espacio de nombres System.Xml.Serialization
contiene clases que se usan para serializar objetos en secuencias o documentos de formato XML. Puede optar por implementar serialización xml mediante la interfaz IXmlSerializable
, que proporciona formato personalizado para la serialización y deserialización XML.
Además de realizar conversiones explícitas de UDT a xml, la serialización XML le permite:
Use XQuery sobre los valores de las instancias udT después de la conversión al tipo de datos xml
. Use udT en consultas con parámetros y métodos web con servicios web XML nativos en SQL Server.
Usar los UDT para recibir una carga masiva de datos XML.
Serializar conjuntos de datos que contengan tablas con columnas UDT.
Los UDT no se serializan en consultas FOR XML. Para ejecutar una consulta FOR XML que muestre la serialización XML de udT, convierta explícitamente cada columna UDT en el tipo de datos xml en la instrucción SELECT
. También puede convertir explícitamente las columnas en varbinary, varchar o nvarchar.