sql_variant (Transact-SQL)
一种数据类型,用于存储 SQL Server 支持的各种数据类型的值。
语法
sql_variant
注释
sql_variant 可以用在列、参数、变量和用户定义函数的返回值中。 sql_variant 使这些数据库对象能够支持其他数据类型的值。
类型为 sql_variant 的列可能包含不同数据类型的行。 例如,定义为 sql_variant 的列可以存储 int、binary 和 char 值。 下表列出了无法使用 sql_variant 存储的值的类型:
varchar(max) |
varbinary(max) |
nvarchar(max) |
xml |
text |
ntext |
image |
rowversion (timestamp) |
sql_variant |
geography |
hierarchyid |
geometry |
用户定义类型 |
datetimeoffset |
sql_variant 的最大长度可以是 8016 个字节。 这包括基类型信息和基类型值。 实际基类型值的最大长度是 8,000 个字节。
对于 sql_variant 数据类型,必须先将它转换为其基本数据类型值,然后才能参与诸如加减这类运算。
可以为 sql_variant 分配默认值。 该数据类型还可以将 NULL 作为其基础值,但是 NULL 值没有关联的基类型。 而且,sql_variant 不能以另一个 sql_variant 作为它的基类型。
唯一键、主键或外键可能包含类型为 sql_variant 的列,但是,组成指定行的键的数据值的总长度不应大于索引的最大长度。 该最大长度是 900 个字节。
一个表可以包含任意多个 sql_variant 列。
不能在 CONTAINSTABLE 和 FREETEXTTABLE 中使用 sql_variant。
ODBC 不完全支持 sql_variant。 因此,使用 Microsoft OLE DB Provider for ODBC (MSDASQL) 时,sql_variant 列的查询将作为二进制数据返回。 例如,包含字符串数据 'PS2091' 的 sql_variant 列将作为 0x505332303931 返回。
比较 sql_variant 值
sql_variant 数据类型在用于转换的数据类型层次结构列表中位于顶部。 为了进行 sql_variant 比较,SQL Server 数据类型层次结构顺序划分为多个数据类型系列。
数据类型层次结构 |
数据类型系列 |
---|---|
sql_variant |
sql_variant |
datetime2 |
日期和时间 |
datetimeoffset |
日期和时间 |
datetime |
日期和时间 |
smalldatetime |
日期和时间 |
date |
日期和时间 |
time |
日期和时间 |
float |
近似数值 |
real |
近似数值 |
decimal |
精确数值 |
money |
精确数值 |
smallmoney |
精确数值 |
bigint |
精确数值 |
int |
精确数值 |
smallint |
精确数值 |
tinyint |
精确数值 |
bit |
精确数值 |
nvarchar |
Unicode |
nchar |
Unicode |
varchar |
Unicode |
char |
Unicode |
varbinary |
Binary |
binary |
Binary |
uniqueidentifier |
Uniqueidentifier |
下列规则适用于 sql_variant 比较:
当不同基本数据类型的 sql_variant 值进行比较,而且基本数据类型属于不同的数据类型系列时,则在层次结构图中数据类型系列较高的值被认为在两个值中较大。
当不同基本数据类型的 sql_variant 值进行比较,而且基本数据类型属于相同的数据类型系列时,则在层次结构图中基本数据类型较低的值先隐式转换为其他数据类型,然后再进行比较。
在比较 char、varchar、nchar 或 nvarchar 数据类型的 sql_variant 值时,将首先基于以下条件来比较这些值的排序规则:LCID、LCID 版本、比较标志和排序 ID。 其中的每个条件都按所列出的顺序作为整数值进行比较。 如果所有这些条件都相等,则将按照排序规则来比较实际的字符串值。
转换 sql_variant 数据
当处理 sql_variant 数据类型时,SQL Server 支持将其他数据类型的对象隐式转换为 sql_variant 类型。 但是,SQL Server 不支持从 sql_variant 数据隐式转换为其他数据类型的对象。