sql_variant (Transact-SQL)
Tipo de datos que almacena valores de varios tipos de datos admitidos en SQL Server.
Sintaxis
sql_variant
Comentarios
sql_variant puede utilizarse en columnas, parámetros, variables y valores devueltos de funciones definidas por el usuario. sql_variant permite que estos objetos de base de datos admitan valores de otros tipos de datos.
Una columna de tipo sql_variant puede contener filas de tipos de datos diferentes. Por ejemplo, una columna definida como sql_variant puede almacenar valores int, binary y char. En la tabla siguiente se muestran los tipos de valores que no se pueden almacenar mediante sql_variant:
varchar(max) |
varbinary(max) |
nvarchar(max) |
xml |
text |
ntext |
image |
rowversion (timestamp) |
sql_variant |
geography |
hierarchyid |
geometry |
Tipos definidos por el usuario |
datetimeoffset |
sql_variant puede tener una longitud máxima de 8.016 bytes. Esto incluye la información y el valor de tipo base. La longitud máxima del tipo base real es 8.000 bytes.
Un tipo de datos sql_variant debe convertirse en su valor de tipo de datos base antes de poder tomar parte en operaciones como la adición y la sustracción.
Se puede asignar un valor predeterminado a sql_variant. Este tipo de datos también puede incluir NULL como valor subyacente, aunque estos valores NULL no dispondrán de un tipo base asociado. Además, sql_variant no puede tener otro sql_variant como su tipo base.
Una clave única, primaria o externa puede incluir columnas del tipo sql_variant, aunque la longitud total de los valores de datos que integran la clave de una fila determinada no debe superar la longitud máxima de un índice. Ésta es de 900 bytes.
Una tabla puede constar de cualquier número de columnas sql_variant.
No se puede utilizar sql_variant en CONTAINSTABLE y FREETEXTTABLE.
ODBC no es totalmente compatible con sql_variant. Por tanto, las columnas de consultas sql_variant se devuelven como datos binarios con el proveedor OLE DB de Microsoft para ODBC (MSDASQL). Por ejemplo, una columna sql_variant que contiene los datos de la cadena de caracteres 'PS2091' se devuelve como 0x505332303931.
Comparar los valores de sql_variant
El tipo de datos sql_variant pertenece a la parte superior de la lista de jerarquías de tipos de datos para conversión. En las comparaciones de sql_variant, el orden de la jerarquía del tipo de datos SQL Server se agrupa en familias de tipos de datos.
Jerarquía de tipo de datos |
Familia de tipo de datos |
---|---|
sql_variant |
sql_variant |
datetime2 |
fecha y hora |
datetimeoffset |
Fecha y hora |
datetime |
fecha y hora |
smalldatetime |
fecha y hora |
date |
fecha y hora |
time |
fecha y hora |
float |
Valores numéricos aproximados |
real |
Valores numéricos aproximados |
decimal |
Valor numérico exacto |
money |
Valor numérico exacto |
smallmoney |
Valor numérico exacto |
bigint |
Valor numérico exacto |
int |
Valor numérico exacto |
smallint |
Valor numérico exacto |
tinyint |
Valor numérico exacto |
bit |
Valor numérico exacto |
nvarchar |
Unicode |
nchar |
Unicode |
varchar |
Unicode |
char |
Unicode |
varbinary |
Binario |
binary |
Binary |
uniqueidentifier |
Uniqueidentifier |
Las comparaciones de sql_variant siguen estas reglas:
Cuando se comparan valores sql_variant de tipos de datos base distintos y los tipos de datos base están en familias de tipos de datos diferentes, el valor cuya familia de tipo de datos ocupa una posición superior en el gráfico de jerarquía se considera el mayor de los dos valores.
Cuando se comparan valores sql_variant de tipos de datos base distintos y los tipos de datos base están en la misma familia de tipos de datos, el valor cuyo tipo de datos base ocupa una posición inferior en el gráfico de jerarquía se convierte implícitamente al otro tipo de datos y, a continuación, se realiza la comparación.
Cuando se comparan valores sql_variant de los tipos de datos char, varchar, nchar o nvarchar, en primer lugar se comparan sus intercalaciones por los siguientes criterios: LCID, versión de LCID, marcas de comparación e Id. de orden. Cada uno de estos criterios se compara como valores enteros y en el orden enumerado. Si todos estos criterios son iguales, se comparan los valores reales de las cadenas según la intercalación.