sql_variant 类型用于存储SQL SERVER中支持的各种数据类型。
为了进行 sql_variant 比较,SQL Server 数据类型层次结构顺序划分为多个数据类型系,sql_variant 数据类型在用于转换的数据类型层次结构列表中位于顶部。
数据类型层次结构 |
数据类型系列 |
---|---|
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。其中的每个条件都按所列出的顺序作为整数值进行比较。如果所有这些条件都相等,则将按照排序规则来比较实际的字符串值。
例如:
begin
declare
@v1 sql_variant = cast ('15.00' as float(53)),
@v2 sql_variant = cast ('15.00' as decimal(18,4)),
@v3 sql_variant = cast ('15' as tinyint),
@v4 sql_variant = cast ('00:00:15.00' as time)
select
case when @v1 > @v2
then 'v1 > v2'
when @v2 > @v1
then 'v2 > v1'
else 'v2 = v1' --
end,
case when @v1 > @v3
then 'v1 > v3'
when @v3 > @v1
then 'v3 > v1'
else 'v3 = v1' --
end,
case when @v2 > @v3
then 'v2 > v3'
when @v3 > @v2
then 'v3 > v2'
else 'v2 = v3' --
end,
case when @v1 > @v4
then 'v1 > v4'
when @v4 > @v1
then 'v4 > v1' --
else 'v4 = v1'
end
end
@v1 和@v2比较,因为 @v1的基本类型float属于近似数值系列,@v2的基本类型decimal属于精确数据系列,所以'v1 > v2'
@v1 和@v3比较,因为@v1的基本类型float属于近似数值系列,@v3的基本类型tinyint属于精确数据系列,所以'v1 > v3'
@v2和@v3比较,因为@v2的基本类型decimal和@v3的基本类型tinyint同属于精确数据系列,v3隐式转换成decimal类型,所以v2 = v3
@v1 和@v4比较,因为@v1的基本类型float属于近似数值系列,@v4的基本类型time 属于日期和时间,所以v4 > v1