Usar tipos de datos especiales

Este tema describe los tipos de datos especiales que están disponibles en SQL Server. Los tipos de datos especiales son los que no se incluyen en ninguna de las categorías de tipos de datos restantes. En SQL Server, los tipos de datos especiales incluyen bit, hierarchyid, sql_variant, sysname, table, timestamp y los tipos de datos de alias.

bit

bit es un tipo de datos numérico que almacena el valor 0 ó 1. Los valores de cadena true y false se pueden convertir en valores bit, como se muestra en el ejemplo siguiente:

SELECT CONVERT (bit, 'true')
SELECT CONVERT(bit, 'false')

En este ejemplo, true se convierte en 1 y false se convierte en 0. Los datos de tipo bit no tienen que incluirse entre comillas simples.

hierarchyid

El tipo de datos hierarchyid se utiliza para administrar las tablas y datos jerárquicos que tienen una estructura jerárquica. Para trabajar con datos jerárquicos en el código de Transact-SQL, utilice las funciones hierarchyid. Para obtener más información, consulte Uso de los tipos de datos hierarchyid (Motor de base de datos).

sql_variant

El tipo de datos sql_variant permite que una sola columna, parámetro o variable almacene valores de datos de tipos distintos. Cada instancia de una columna sql_variant registra el valor y los metadatos que describen el valor. Se dispone de los metadatos siguientes:

  • Tipo de datos base

  • Tamaño máximo

  • Escala

  • Precisión

  • Intercalación

Para recuperar los metadatos de una instancia de sql_variant concreta, utilice la función SQL_VARIANT_PROPERTY.

En el ejemplo siguiente, la segunda tabla contiene una columna de tipo sql_variant:

CREATE TABLE ObjectTable (
   ObjectID int CONSTRAINT PKObjectTable PRIMARY KEY,
   ObjectName nvarchar(80),
   ObjectWeight decimal(10,3),
   ObjectColor nvarchar(20))
CREATE TABLE VariablePropertyTable (
   ObjectID int REFERENCES ObjectTable(ObjectID),
   PropertyName nvarchar(100),
   PropertyValue sql_variant,
   CONSTRAINT PKVariablePropertyTable
   PRIMARY KEY(ObjectID, PropertyName))

sysname

El tipo de datos sysname se utiliza para las columnas de tabla, variables y parámetros de procedimiento almacenado que almacenan los nombres de objeto. La definición exacta de sysname está relacionada con las reglas de los identificadores. Por lo tanto, puede variar entre instancias de SQL Server. sysname es igual desde el punto de vista funcional que el tipo nvarchar(128) salvo que el valor predeterminado de sysname es NOT NULL. En las versiones anteriores de SQL Server, sysname se define como de tipo varchar(30).

Nota importanteImportante

En las bases de datos que distinguen entre mayúsculas y minúsculas o que incluyen una intercalación binaria, sysname se reconoce como un tipo de datos del sistema de SQL Server sólo si aparece en minúsculas.

table

El tipo de datos table funciona igual que una tabla temporal. Se utiliza para almacenar un conjunto de resultados que procesar posteriormente. Este tipo de datos sólo se puede utilizar para definir variables locales de tipo table y el valor devuelto de una función definida por el usuario.

La definición de una variable de tabla o un valor devuelto incluye las definiciones de las columnas, el tipo de datos, la precisión y la escala de cada columna, y las restricciones opcionales PRIMARY KEY, UNIQUE, NULL y CHECK. Una tabla definida por el usuario no se puede usar como tipo de datos.

El formato de las filas que se almacenan en una variable table o que devuelve una función definida por el usuario se deben definir cuando se declara la variable o se crea la función. La sintaxis se basa en la de CREATE TABLE, por ejemplo:

DECLARE @TableVar TABLE (Cola int PRIMARY KEY, Colb char(3))
INSERT INTO @TableVar VALUES (1, 'abc')
INSERT INTO @TableVar VALUES (2, 'def')
SELECT * FROM @TableVar
GO

Las variables de table y las funciones definidas por el usuario que devuelven una table se pueden usar únicamente en ciertas instrucciones SELECT e INSERT, y donde se admiten tablas en las instrucciones UPDATE, DELETE y DECLARE CURSOR. Las variables table y las funciones definidas por el usuario que devuelven una table no se pueden usar en ninguna otra instrucción Transact-SQL.

Los índices u otras restricciones que se aplican a la tabla se deben definir como parte de la variable DECLARE o de la instrucción CREATE FUNCTION. No se pueden aplicar posteriormente porque las instrucciones CREATE INDEX o ALTER TABLE no pueden hacer referencia a las variables de tabla y a las funciones definidas por el usuario.

Para obtener más información acerca de la sintaxis que se utiliza para definir las variables de tipo table y las funciones definidas por el usuario, vea DECLARE @local\_variable (Transact-SQL) y CREATE FUNCTION (Transact-SQL).

timestamp

El tipo de datos timestamp no tiene nada que ver con la hora o la fecha. Los valores de tipo timestamp son números binarios que indican la secuencia relativa en la que las modificaciones de datos han tenido lugar en una base de datos.

No use nunca columnas de tipo timestamp en las claves, especialmente en las claves principales, porque el valor timestamp cambia siempre que se modifica la fila.

Para registrar el momento en que se producen modificaciones de datos en una tabla, use un tipo de datos datetime2 o smalldatetime para registrar los eventos y desencadenadores, y actualizar automáticamente los valores cuando alguna modificación tenga lugar.

Tipos de datos de alias

Los tipos de datos de alias permiten ampliar un tipo de datos base de SQL Server, como varchar, con un nombre descriptivo y un formato que se pueden personalizar para un uso específico. Por ejemplo, la instrucción siguiente implementa un tipo de datos definido por el usuario birthday que se basa en el tipo de datos datetime y permite valores NULL (NULL):

EXEC sp_addtype birthday, datetime, 'NULL'

Tenga cuidado al seleccionar los tipos base para implementar tipos de datos definidos por el usuario. Por ejemplo, en Estados Unidos, los números de la seguridad social tienen el formato nnn-nn-nnnn. Aunque estos números contienen también números, forman un identificador y no están sujetos a operaciones matemáticas. Por lo tanto, es una práctica común crear un tipo de datos para el número de la seguridad social como de tipo varchar y crear una restricción CHECK para exigir el formato de los números de la seguridad social que se almacenan en la tabla, según se muestra en el ejemplo siguiente:

EXEC sp_addtype SSN, 'VARCHAR(11)', 'NOT NULL'
GO
CREATE TABLE ShowSSNUsage (EmployeeID int PRIMARY KEY, EmployeeSSN SSN, CONSTRAINT CheckSSN CHECK ( EmployeeSSN LIKE '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]' )
)
GO

Si las columnas SSN se suelen usar como columnas de clave en los índices, especialmente en los índices clúster, el tamaño de las claves puede reducirse de 11 a 4 bytes, siempre que el tipo de datos definido por el usuario SSN se implemente en cambio con el tipo de datos base int. Esta reducción en el tamaño de la clave mejora la recuperación de los datos. La mayor eficacia de la recuperación de datos y la eliminación de la necesidad de la restricción CHECK normalmente compensarán el proceso de conversión adicional del tipo int a un formato de carácter cuando se muestran o modifican valores SSN.