Compartir a través de


Requisitos de tipo definido por el usuario (UDT)

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 un static 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 (o Shared) Parse método que admita el análisis y un método de ToString 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 un Read y un método Write.

  • 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 atributo XmlIgnore 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 ser true comparar datos en orden de bytes. Si la interfaz de IComparable no se implementa y SqlUserDefinedTypeAttribute.IsByteOrdered es false, 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 (o Shared) 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 campo MaxByteSized.

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:

bool, byte , , short, ushort, int, uint, long , ulong, float, , , , , , , ,

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 como StructLayout.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 es false.

  • Especifique la propiedad MaxByteSize del Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.

  • Escriba código para implementar métodos Read y Write para el UDT mediante la implementación de la interfaz System.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 8000o 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 y UNIQUE en columnas de este tipo.

  • La capacidad de usar Transact-SQL ORDER BYcláusulas , GROUP BYy PARTITION 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.